让我说我的字符串格式是这样的:
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欧元时,这将失败。 这里','完全有不同的含义。
我四处寻找一个好的解决方案,但不能。我正在寻找一个通用的解决方案。
答案 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
如果price
为12,345.67
,decimalCharacter
将为.
。如果是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