不同文化中的 JavaScript parseFloat

问题描述 投票:0回答:5

我对 JavaScript 的 parseFloat 函数在世界不同地区的默认行为有疑问。

在美国,如果您对字符串“123.34”调用 parseFloat,您将得到浮点数 123.34。

如果我在瑞典或巴西开发代码,并且他们使用逗号而不是句点作为小数分隔符,则 parseFloat 函数是否期望“123,34”或“123.34”。

请注意,我不是问如何解析美国不同文化的数字格式。我问的是,瑞典或巴西的 parseFloat 的行为是否与美国境内的行为相同,或者它是否期望本地格式的数字?或者为了更好地考虑这一点,巴西/瑞典的开发人员是否必须将字符串转换为英文格式,然后才能在从文本框中提取文本后使用 parseFloat ?

如果这没有意义,请告诉我。

javascript culture
5个回答
79
投票

parseFloat
不使用您的语言环境的定义,而是使用十进制文字的定义。

它只解析

.
而不是
,

我是巴西人,在解析十进制数字之前我必须用点替换逗号。

parseFloat 规范


16
投票

不,

parseFloat
被指定来解析
DecimalLiterals
,它使用点作为小数点分隔符。它不依赖于当前环境的区域设置。


4
投票

不仅仅是瑞典/巴西。 F.ex 在美国,他们经常添加大量逗号,例如

$5,762,325.25

parseFloat
函数本质上处理小数,而不是区域设置字符串。

一般来说,JavaScript 有时可以将通用字符串/数字/日期转换为区域友好格式,但反之则不然。


1
投票

如果您确定是巴西格式,只需在解析之前将号码转换为美国格式即可。

function parseItalianNumber(stringNum) {
    return parseFloat(stringNum.replaceAll(".","").replaceAll(",","."));
}

在意大利我们也使用 .作为千位分隔符。这会删除所有千位分隔符,以防万一(您不希望周围有很多点),然后在调用 parseFloat 之前将逗号转换为点。


0
投票

补充 FrancescoMM 给出的答案,您必须使用正则表达式来处理非常大的数字。使用字符串作为参数的 String.replace 将仅替换第一次出现的位置。所以 999.999.999,99 变成 999999.999.99

stringNum.replace(/\./g, "").replace(/\,/g, ".")

来源:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace

© www.soinside.com 2019 - 2024. All rights reserved.