4

假设我有一个字符串格式的金额,如下所示:

amount = '12,000.00'

我想将其转换为数字(Javascript)或浮点数。

parseFloat(amount) // this gives me 12 as a result
Number(amount) // this gives me NaN as a result

我认为的其他解决方案是:

parseFloat(amount.replace(/[,]/g, ''))

这工作正常。但这里的问题是语言环境。

当金额为 12000,00 欧元时,这将失败。这里的“,”具有完全不同的含义。

我四处寻找一个好的解决方案,但找不到。我正在寻找一个通用的解决方案。

4

3 回答 3

1

这并不容易,因为您无法确切知道千位的分隔符是什么,小数部分的分隔符是什么

考虑“12.000.000”是它12000.000 === 12000还是12000000

但是,如果您将要求最后一个定界符始终是十进制定界符 - 这意味着如果至少给出一个定界符,最后一个定界符必须是十进制定界符,*如果后面的数字不超过定义的长度。

然后你可以尝试以下

编辑

(如果您对旧功能感兴趣,请参阅revs )

我添加了在最后一个分隔符“,”或“。”之后定义最大数字长度的功能。直到它被视为浮点数,之后它作为整数返回

var amounts = ["12000","12.000,00", "12,000.00", "12,000,01", "12.000.02", "12,000,001"];


formatMoney.maxDecLength = 3; //Set to Infinity o.s. to disable it

function formatMoney(a) {
    var nums = a.split(/[,\.]/);
    var ret = [nums.slice(0, nums.length - 1).join("")];
    if (nums.length < 2) return +nums[0];
    ret.push(nums[nums.length - 1]);
    return +(ret.join(nums[nums.length - 1].length < formatMoney.maxDecLength ? "." : ""));
}

for ( var i=0,j;j=amounts[i];i++)
    console.log (j + " -> " +formatMoney(j));

给出输出:

"12000 -> 12000"
"12.000,00 -> 12000"
"12,000.00 -> 12000"
"12,000,01 -> 12000.01"
"12.000.02 -> 12000.02"
"12,000,001 -> 12000001" //as you can see after the last "," there are 3 digits and its treated as integer

另一个 JSBin

于 2013-05-27T08:29:26.430 回答
0

您可以通过这种方式获取本地十进制分隔符:

1.1.toLocaleString().substr(1,1)

在解析浮点数之前,您可以确保字符串只包含数字(可能是减号)和本地小数分隔符。

于 2013-05-27T07:39:48.267 回答
0

事实是,你永远不会知道格式。12,345. 是那个12345,还是另一个语言环境版本12.345

但是,如果您有一致的小数,那么您可以lastIndexOf在逗号上使用该函数,句点将显示小数位和字符。

var price = '12,345.67';
var lastPeriod = price.lastIndexOf('.');
var lastComma = price.lastIndexOf(',');
if (lastComma != -1 && lastComma > lastPeriod) {
    decimalCharacter = ',';
} else {
    decimalCharacter = '.';
}
console.log(decimalCharacter); //. or , based on how the price string looks - see below

如果price12,345.67decimalCharacter将会是.。如果是12.345,67,它将返回为,

于 2013-05-27T07:46:00.187 回答