我有2,299.00
一个字符串,我试图将它解析为一个数字。我尝试使用parseFloat
,结果为 2。我想逗号是问题所在,但我将如何以正确的方式解决此问题?去掉逗号就可以了?
var x = parseFloat("2,299.00")
console.log(x);
我有2,299.00
一个字符串,我试图将它解析为一个数字。我尝试使用parseFloat
,结果为 2。我想逗号是问题所在,但我将如何以正确的方式解决此问题?去掉逗号就可以了?
var x = parseFloat("2,299.00")
console.log(x);
是删除逗号:
let output = parseFloat("2,299.00".replace(/,/g, ''));
console.log(output);
删除逗号有潜在危险,因为正如其他人在评论中提到的那样,许多语言环境使用逗号来表示不同的东西(如小数位)。
我不知道你从哪里得到你的字符串,但在世界上的某些地方"2,299.00"
=2.299
该Intl
对象可能是解决此问题的好方法,但不知何故,他们设法仅使用Intl.NumberFormat.format()
API 而没有parse
对应物来发布规范:(
以任何 i18n 理智的方式将包含文化数字字符的字符串解析为机器可识别的数字的唯一方法是使用利用 CLDR 数据的库来覆盖格式化数字字符串的所有可能方式http://cldr.unicode。组织/
到目前为止,我遇到的两个最好的 JS 选项:
在现代浏览器上,您可以使用内置的Intl.NumberFormat来检测浏览器的数字格式并将输入规范化以匹配。
function parseNumber(value, locales = navigator.languages) {
const example = Intl.NumberFormat(locales).format('1.1');
const cleanPattern = new RegExp(`[^-+0-9${ example.charAt( 1 ) }]`, 'g');
const cleaned = value.replace(cleanPattern, '');
const normalized = cleaned.replace(example.charAt(1), '.');
return parseFloat(normalized);
}
const corpus = {
'1.123': {
expected: 1.123,
locale: 'en-US'
},
'1,123': {
expected: 1123,
locale: 'en-US'
},
'2.123': {
expected: 2123,
locale: 'fr-FR'
},
'2,123': {
expected: 2.123,
locale: 'fr-FR'
},
}
for (const candidate in corpus) {
const {
locale,
expected
} = corpus[candidate];
const parsed = parseNumber(candidate, locale);
console.log(`${ candidate } in ${ corpus[ candidate ].locale } == ${ expected }? ${ parsed === expected }`);
}
它们显然有一些优化和缓存的空间,但这在所有语言中都可以可靠地工作。
删除任何不是数字、小数点或减号 ( -
) 的内容:
var str = "2,299.00";
str = str.replace(/[^\d\.\-]/g, ""); // You might also include + if you want them to be able to type it
var num = parseFloat(str);
请注意,它不适用于科学记数法中的数字。如果你想让它,改变replace
行添加e
,E
和+
到可接受的字符列表:
str = str.replace(/[^\d\.\-eE+]/g, "");
通常您应该考虑使用不允许对数值进行自由文本输入的输入字段。但在某些情况下,您可能需要猜测输入格式。例如,德国的 1.234,56 表示美国的 1,234.56。有关使用逗号作为十进制的国家/地区列表,请参阅https://salesforce.stackexchange.com/a/21404。
我使用以下函数进行最佳猜测并去除所有非数字字符:
function parseNumber(strg) {
var strg = strg || "";
var decimal = '.';
strg = strg.replace(/[^0-9$.,]/g, '');
if(strg.indexOf(',') > strg.indexOf('.')) decimal = ',';
if((strg.match(new RegExp("\\" + decimal,"g")) || []).length > 1) decimal="";
if (decimal != "" && (strg.length - strg.indexOf(decimal) - 1 == 3) && strg.indexOf("0" + decimal)!==0) decimal = "";
strg = strg.replace(new RegExp("[^0-9$" + decimal + "]","g"), "");
strg = strg.replace(',', '.');
return parseFloat(strg);
}
在这里试试:https : //plnkr.co/edit/9p5Y6H?p=preview
例子:
1.234,56 € => 1234.56
1,234.56USD => 1234.56
1,234,567€ => 1234567
1.234.567 => 1234567
1,234.567 => 1234.567
1.234 => 1234 // might be wrong - best guess
1,234 => 1234 // might be wrong - best guess
1.2345 => 1.2345
0,123 => 0.123
该函数有一个弱点:如果您有 1,123 或 1.123,则无法猜测格式 - 因为根据区域设置格式,两者都可能是逗号或千位分隔符。在这种特殊情况下,该函数会将分隔符视为千位分隔符并返回 1123。