2010-01-18 76 views
41

當我寫一段JavaScript代碼處理一些浮點值時,一個想法讓我感到震驚。 JavaScript中的小數點符號是什麼?它總是.?或者是文化特定的?那麼.toFixed().parseFloat()呢?如果我正在處理用戶輸入,它可能會包含本地文化特定的小數點分隔符。什麼是JavaScript中的小數點分隔符符號?

最終,我想編寫支持用戶輸入中兩個小數點的代碼 - 文化特定和.,但如果我不知道JavaScript期望什麼,我就不能編寫這樣的代碼。

新增: OK,魯本斯法里亞斯suggestssimilar question其中有一個整潔的接受的答案:

function whatDecimalSeparator() { 
    var n = 1.1; 
    n = n.toLocaleString().substring(1, 2); 
    return n; 
} 

這很好,它讓我得到了現場小數點。毫無疑問,邁向解決方案的一步。

現在,剩下的部分將是確定.parseFloat()的行爲是什麼。有幾個回答指出,對於浮點文字,只有.是有效的。 .parseFloat()的行爲方式是否相同?或者可能需要在某些瀏覽器中使用本地小數點分隔符?是否有任何解析浮點數的方法?我應該推出我自己的即將確定嗎?

+0

@ Vilx-對於你在做什麼,我會考慮使用一元(+)運算符而不是'parseFloat()'。驗證輸入時會容易得多。看到我更新的答案。 – 2010-01-18 11:06:46

回答

19

根據規範中,DecimalLiteral定義爲:

DecimalLiteral :: 
    DecimalIntegerLiteral . DecimalDigitsopt ExponentPartopt 
    . DecimalDigits ExponentPartopt 
    DecimalIntegerLiteral ExponentPartopt 

並滿足parseFloat參數:

  1. 讓inputString爲ToString(string)。
  2. 讓trimmedString是inputString組成,是不是一個StrWhiteSpaceChar和所有字符到字符的右側最左邊字符的字符串。(換言之,去掉前面的空格。)
  3. 如果沒有trimmedString也沒有任何前綴的trimmedString滿足StrDecimalLiteral的語法(見9.3.1),返回NaN。
  4. 讓numberString是trimmedString的最長前綴,它可能是trimmedString本身,它滿足StrDecimalLiteral的語法。
  5. 返回該MV

數的值,所以numberString變成滿足StrDecimalLiteral的語法,這意味着它發現在輸入第一個解析的文字串號trimmedString的最長前綴。只有.可用於指定浮點數。如果你從不同的區域接受的輸入,使用一個字符串替換:

function parseLocalNum(num) { 
    return +(num.replace(",", ".")); 
} 

該函數使用單目運算符,而不是parseFloat,因爲在我看來,要嚴格對輸入。 parseFloat("1ABC")將是1,而使用一元運算符+"1ABC"返回NaN。這使驗證輸入更容易。使用parseFloat只是猜測輸入的格式是正確的。

+0

這是文字。 '.parseFloat()'需要做同樣的事情嗎? – 2010-01-18 10:38:51

+3

是的。 'parseFloat(「1,01」)'在任何語言環境中都會返回'1',而不是'1.01' – 2010-01-18 10:41:02

+4

Mozilla Developer Center說:「parseFloat解析它的參數,一個字符串並返回一個浮點數,如果遇到一個字符除了符號(+或 - ),數字(0-9),小數點或指數以外,它會返回該值並忽略該字符和所有後續字符,允許使用前導和尾隨空格。 https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Functions/parseFloat – 2010-01-18 10:45:33

2

據我所知,JavaScript本身只知道.分隔符爲小數。至少有一人他們的判斷,我相信對JS的東西贊同:

http://www.merlyn.demon.co.uk/js-maths.htm#DTS

+2

要添加到此,請參閱語法和解析數字文字的舊ECMAScript 262規範:http://bclary.com/2004/11/07/#a-7.8.3 – Anonymous 2010-01-18 10:32:23

+0

啊,是的,總是有很好的官方文檔這種事情,謝謝:) – 2010-01-18 10:35:05

+0

是的,這是文字。怎麼解析字符串輸入? – 2010-01-18 10:36:01

9

使用:

theNumber.toLocaleString(); 

得到正確格式的字符串,用正確的小數和千位分隔

+0

好的。我該如何解析這些分隔符的字符串? – 2010-01-18 10:33:21

+0

你需要刪除seps,並確保它符合如下內容:[[0-9] + | [0-9] *(\。([eE] [\ + \ - ]?[0-9] +))?) – jspcal 2010-01-18 10:42:51

+0

夠公平的,我可以去掉任何需要的東西,並且可以用'.'替換locale特定的分隔符。但'.'是'.parseFloat()'期望的唯一東西嗎? – 2010-01-18 10:45:31

相關問題