什么是JavaScript中的小数点分隔符?

当我写一段处理一些浮点值的JavaScript代码时,一个想法让我感到震惊。 什么是JavaScript中的小数点符号? 是否永远. ? 或者是文化特定的? 那么.toFixed().parseFloat()呢? 如果我正在处理用户input,则可能会包含本地文化特定的小数点分隔符。

最终我想编写支持用户input的两个小数点的代码 – 文化特定和. ,但是我不能写这样的代码,如果我不知道JavaScript的期望。

补充:好的,鲁本斯·法里亚斯( Rubens Farias) build议看看类似的问题 ,这个问题有一个简洁的接受答案:

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

这很好,它让我得到区域的小数点。 毫无疑问,迈出了一步。

现在,剩下的部分将是确定.parseFloat()的行为。 有几个答案指出,只适用于浮点文字. 已validation。 .parseFloat()行为是一样的吗? 或者可能需要在某些浏览器中使用本地小数点分隔符? 是否有任何不同的parsing浮点数的方法? 我是否应该推出我自己的即将确定?

根据规范,DecimalLiteral被定义为:

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

并满足parseFloat参数:

  1. 让inputString是ToString(string)。
  2. 让trimmedString是一个inputString的子string,它由不是StrWhiteSpaceChar的最左边的字符和该字符右边的所有字符组成(换句话说,删除前导空格)。
  3. 如果trimmedString和trimmedString的前缀均不满足StrDecimalLiteral的语法(见9.3.1),则返回NaN。
  4. 让numberString是trimmedString的最长前缀,它可以是trimmedString本身,它满足StrDecimalLiteral的语法。
  5. 返回MV的数字值

因此,numberString成为trimmedString的最长前缀,满足StrDecimalLiteral的语法,这意味着它在input中find的第一个可parsing的文字string编号。 只有. 可以用来指定一个浮点数。 如果您接受来自不同地区的input,请使用stringreplace:

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

该函数使用一元运算符而不是parseFloat,因为在我看来,您要对input进行严格的处理。 parseFloat("1ABC")将是1 ,而使用一元运算符+"1ABC"将返回NaN 。 这使validationinput更容易。 使用parseFloat只是猜测input的格式是正确的。

使用:

 theNumber.toLocaleString(); 

以正确的小数点和千位分隔符来获得格式正确的string

据我所知,JavaScript本身只知道的. 分隔符为小数。 至less有一个人对JS的东西有信心:

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