2010-01-18 78 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

相关问题