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

时间:2010-01-18 10:23:46

标签: javascript parsing syntax decimal-point

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

最终,我想编写支持用户输入中的两个小数点的代码 - 特定于文化和.,但如果我不知道JavaScript期望什么,我就不能编写这样的代码。< / p>

已添加:确定,Rubens Farias suggests查看similar question,其答案很简洁:

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

这很好,它让我得到locale小数点。毫无疑问,迈向解决方案迈出了一步。

现在,剩下的部分是确定.parseFloat()的行为。几个答案指出,对于浮点文字,只有.有效。 .parseFloat()的行为方式是否相同?或者它可能在某些浏览器中需要本地小数点分隔符?是否有任何不同的方法来解析浮点数?我应该推出自己刚刚确定的吗?

3 个答案:

答案 0 :(得分:21)

根据规范,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的数字值
  6. 因此numberString成为trimmedString的最长前缀,它满足StrDecimalLiteral的语法,这意味着它在输入中找到的第一个可解析的文字字符串数。只有.可用于指定浮点数。如果您接受来自不同语言环境的输入,请使用字符串替换:

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

    该函数使用一元运算符而不是parseFloat,因为在我看来,您希望对输入严格。 parseFloat("1ABC")1,而使用一元运算符+"1ABC"会返回NaN。这使得验证输入变得更加容易。使用parseFloat只是猜测输入格式正确。

答案 1 :(得分:12)

使用:

theNumber.toLocaleString();

使用正确的小数和千位分隔符获取格式正确的字符串

答案 2 :(得分:2)

据我所知,javascript本身只知道小数的.分隔符。至少有一个人相信我对JS事物的判断同意:

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