在JavaScript中解析带有逗号小数分隔符的数字

31

我使用这个函数来检查一个值是否为数字:

function isNumber(n) {
    return !isNaN(parseFloat(n)) && isFinite(n);
}

我的程序需要处理德国的数值。我们使用逗号作为小数点分隔符,而不是点,所以这个函数不起作用。

我尝试过这样做:

n.replace(",",".")

但它似乎也没有起作用。我尝试使用的确切函数是:

function isNumber(n) {
    n=n.replace(",",".");
    return !isNaN(parseFloat(n)) && isFinite(n);
}

如果我的陈述不够清晰,那么数字看起来像这样9.000,28而不是通常的9,000.28


2
当数字大于999时,是否有“.”? - Joseph Silber
2
请记住,replace方法返回一个新的字符串。 - Felix Kling
1
请发布使用 replace 的完整代码。那应该足够了,所以肯定还有其他问题。 - James Montagne
3个回答

36

您需要先替换(删除)千分位分隔符中的点号,然后再处理小数点:

function isNumber(n) {
    'use strict';
    n = n.replace(/\./g, '').replace(',', '.');
    return !isNaN(parseFloat(n)) && isFinite(n);
}

失败原因为 111.222.3333,44演示.replace 只会替换第一个匹配项,除非你使用全局正则表达式。编辑:糟糕,我弄错了输入字符串 - Brigand
@FakeRainBrigand 谢谢,我更新了我的代码.. 对正则表达式不是很好,你觉得这样对吗? - rink.attendant.6
是的,完全正确(我在原始代码中搞错了) - Brigand
1
这个解决方案适用于“好”的用户,但验证需要即使对于“坏”的用户也能正常工作。如果你有以下内容(例如),这将通过测试,但实际上是不应该的:var testNumber =“10.0.0,000”。 - drew_w

28
var number = parseFloat(obj.value.replace(",",""));

你可能也希望这个能够相反地进行...

obj.value = number.toLocaleString('en-US', {minimumFractionDigits: 2});

2
使用这个答案,123.4会被解析为1234,本地化则为1234.00。但这并没有回答问题,即如何解析逗号作为小数分隔符的情况。 - Dan

6

我认为最好的方法就是使用toLocaleString方法。例如,我住在巴西,在这里我们使用逗号作为小数分隔符。那么我可以这样写:

var number = 10.01;
console.log(number)
// log: 10.01

console.log(number.toLocaleString("pt-BR"));
// log: 10,01


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接