Javascript:将货币的字符串表示形式转换为数字

时间:2013-05-27 07:35:36

标签: javascript number-formatting money-format

让我说我的字符串格式是这样的:

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, ''))

这很好用。但这里的问题是Locale。

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

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

3 个答案:

答案 0 :(得分:0)

您可以通过以下方式获取本地小数分隔符:

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

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

答案 1 :(得分: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,则会将其返回为,

答案 2 :(得分:0)

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

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

但是如果你要设置最后一个分隔符始终是十进制分隔符的要求 - 意思是如果给出至少一个分隔符,则最后一个具有作为小数分隔符,*如果后面的数字不超过定义的长度。

然后你可以尝试以下

修改

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

我能够在最后一个分隔符“,”或“。”之后定义最大数字长度。直到它被视为float,然后返回为整数

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