2011-03-16 59 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

相關問題