我如何正确清理用户输入的货币值?
我需要将该值作为大十进制数,但是用户的输入字段是标准文本输入。 我正在尝试设置字符串格式,但是,我找不到一种可以对用户通常插入的所有变体进行干净处理的方法。
我尝试过:
parseFloat(amount.replace(',', '.')
这在以下情况下有效:
1000 -> 1000
1000.1 -> 1000.1
1000,1 -> 1000.1
但是,我有以下两种情况目前不起作用:
1,000.1 -> gives: 1.1 / should be: 1000.1
1.000,1 -> gives 1.1 / should be: 1000.1
是否有一种格式化字符串的方法,以便在用户输入一个或多个逗号或点作为小数点分隔符时也可以使用?
答案 0 :(得分:1)
据我所知,代码需要区分小数点分隔符和千位分隔符。只能有一个十进制分隔符,通常是最后一个'。或“,”在输入中。您只能将字符串中的最后一个','替换为'。'。并删除所有其余的“,”和“。”从输入。这将适用于您提供的测试用例,但是如果用户输入类似100,001的内容,并且','用作千位分隔符,则代码仍将失败。我认为最好的方法是使用某种输入掩码或表示正确输入值类型的帮助段落。
答案 1 :(得分:1)
尝试一下。
function parse(str){
if(str.includes('.') && str.includes(',')){
str = str.split(/[.,]/)
let last = str.lastIndexOf('.') || str.lastIndexOf(',');
return parseFloat(str.slice(0,last).join('').replace(/[.,]/g,'') + '.' + str.slice(last))
}
else return str.replace(',','.');
}
console.log(parse('1.000,1'))
console.log(parse('1,000.1'))
console.log(parse('1,0000'))
答案 2 :(得分:1)
这是我对10个测试用例的建议:
const getCorrectValue = (value = 0) => {
return (''+value)
.replace(',','.')
.match(/.\d*/g)
.map((val, i, arr) => {
return (i < arr.length - 1)
? val.replace(/[,|\.]/g, '')
: val
})
.join('');
}
const testCases = [
getCorrectValue() === "0",
getCorrectValue(1.0) === "1",
getCorrectValue("1") === "1",
getCorrectValue("1,0") === "1.0",
getCorrectValue("1.0") === "1.0",
getCorrectValue(1.1) === "1.1",
getCorrectValue("1,1") === "1.1",
getCorrectValue("1.1") === "1.1",
getCorrectValue("1,000.1") === "1000.1",
getCorrectValue("1.000.1") === "1000.1",
getCorrectValue("1,000.000.1") === "1000000.1",
];
console.log('Test pass', testCases.map((testCase, i) => (testCase) ? `${i} pass` : `${i} fails`));