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

IT技术 javascript parsing syntax decimal-point
2021-02-22 15:13:47

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

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

补充:好的,Rubens Farias建议查看类似的问题,该问题有一个简洁的公认答案:

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

太好了,它让我可以得到语言环境的小数点。毫无疑问,朝着解决方案迈出了一步。

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

3个回答

根据规范,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 只是猜测输入的格式正确。

因为 ECMAScript 262 规范中已经定义了 DecimalLiteral :)
2021-04-16 15:13:47
@Vilx-大声笑这不是我的话,而是 ECMA International 的话!
2021-04-17 15:13:47
我会相信你的话,因为我懒得自己查阅规范。XD 谢谢!:)
2021-04-24 15:13:47
是的。parseFloat("1,01")在任何语言环境中都会返回1,而不是1.01
2021-04-25 15:13:47
Mozilla 开发者中心说:“parseFloat 解析它的参数,一个字符串,并返回一个浮点数。如果遇到符号(+ 或 -)、数字(0-9)、小数点或指数以外的字符,它返回到该点的值并忽略该字符和所有后续字符。允许前导和尾随空格。” developer.mozilla.org/en/Core_JavaScript_1.5_Reference/...
2021-04-27 15:13:47

利用:

theNumber.toLocaleString();

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

行。以及如何使用这些分隔符解析字符串?
2021-04-17 15:13:47
我在谷歌浏览器中试过这个,没有看到“千位分隔符”
2021-04-18 15:13:47
你需要去掉 sep,并确保它符合以下内容: [\+\-]?([0-9]+|[0-9]*(\.([eE][\+ \-]?[0-9]+)))?)
2021-04-23 15:13:47
公平地说,我可以删除任何需要的东西,并且可以用.. 但这是.唯一.parseFloat()期望的吗?
2021-05-12 15:13:47
请参阅对 Andy E 原始答案的回复(简短回答:是)
2021-05-13 15:13:47

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

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

啊,是的,有这类事情的官方文档总是很好,谢谢:)
2021-04-19 15:13:47
要添加到这一点,请参阅有关解析数字文字的语法的旧 ECMAScript 262 规范:bclary.com/2004/11/07/#a-7.8.3
2021-04-23 15:13:47
是的,这适用于文字。解析字符串输入怎么样?
2021-05-13 15:13:47
取1234.56等固定数字,.toLocaleString()通过jspcal提到方法运行检查结果以确定您的小数和千位分隔符是什么。通过应用这些分隔符的函数运行显示给用户的所有数字(请参阅我提供的链接示例)。
2021-05-13 15:13:47