2011-03-16 71 views
3

我有一个HTML输入元素,我试图在用户更改值后强制输入一个小数位。所以,让我们说,用户输入“4”,运行此代码:为什么我不能使用toFixed在HTML输入对象的值上?

this.value = this.value.toFixed(1) 

但后来我得到一个JavaScript错误说“对象4没有方法‘toFixed’”。

似乎JavaScript正在尝试将数字处理为数字并且失败,但呃为什么?我如何避免它?

+0

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Number/toFixed – naveen 2011-03-16 19:09:39

回答

22

this.value是一个String当你从输入元素得到它。你需要将其转换为数值,然后才能使用就可以了许多的方法:

this.value = Number(this.value).toFixed(1); 

或者您可以使用一元+操作字符串转换为数值:

this.value (+this.value).toFixed(1); 

如果您需要删除的字符串后缀,那么你可以使用parseFloat

this.value = parseFloat(this.value).toFixed(1); 

不过,值得注意的是,parseFloat手柄十六进制格式,而铸造Number确实

this.value = +'0xF'; //15 
this.value = parseFloat('0xF'); //0 
+0

谢谢。这样做了(尽管我下面拿Ben Blank的“parseFloat”建议)。我想我已经习惯了JavaScript在类型转换方面更加灵活...... – 2011-03-16 19:31:57

+0

它非常灵活,但它只能查看与当前对象类型关联的方法。如果你需要一个特定的精度,'toFixed'就很有用,'parseFloat' /'parseInt'对于类型/值转换很有用。 – zzzzBov 2011-03-16 19:40:34

+0

- 我想你误解了我的建议;我主张'this.value = parseFloat(this.value).toFixed(1);' – 2011-03-16 20:48:18

3

转换为数字第一,

this.value = Number(this.value).toFixed(1); 

this.value是一个字符串,并且字符串没有toFixed方法。

+0

使用'Number'构造函数为此过度杀伤; 'parseFloat'可能是更好的选择。 – 2011-03-16 19:10:05

+0

@Ben Blank,'Number()'不被用作构造函数,它被用于投射。与服务器脚本不同,JS倾向于没有那么多的性能要求,并且@Jeff Chausse确实需要特定的精度,因此在这种情况下,转换为数字是合适的。如果没有任何精确的数字表示方式,'parseFloat'肯定会成为一种方法。 – zzzzBov 2011-03-16 19:45:34

+1

@zzzzBov - 它是否被用作构造函数不是问题; 'parseFloat'被设计用于将字符串转换为浮点数的特定目的,因此很多JS引擎都将其优化(例如,将其直接传递给底层的C函数)。 Number不受益于这样的优化,因为它具有更广的范围,并且必须首先通过一些检查。我不确定你的意思是“没有任何精度”......这个'Number'调用将导致调用与'parseFloat'相同的内部方法。 – 2011-03-16 20:47:31

相关问题