49

当我正在编写一段处理一些浮点值的 JavaScript 代码时,我突然想到了一个想法。JavaScript 中的小数点符号是什么?总是这样.吗?或者它是特定于文化的?那么.toFixed().parseFloat()呢?如果我正在处理用户输入,它可能包含本地文化特定的小数分隔符。

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

补充:好的,Rubens Farias建议看看类似的问题,它有一个整洁的接受答案:

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

很好,它可以让我获得语言环境小数点。毫无疑问,迈向解决方案的一步。

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

4

3 回答 3

23

根据规范,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 的 Number 值

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

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

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

于 2010-01-18T10:38:00.067 回答
13

利用:

theNumber.toLocaleString();

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

于 2010-01-18T10:30:32.347 回答
2

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

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

于 2010-01-18T10:29:54.417 回答