Javascript-干净的用户输入的货币价值

Javascript-干净的用户输入的货币价值,javascript,parsing,numbers,Javascript,Parsing,Numbers,如何正确清理用户输入的货币值 我需要一个大的十进制值,但用户的输入字段是标准文本输入。 我正在尝试格式化字符串,但是,对于用户通常插入的所有变体,我找不到一种干净的方法 我试过这个: parseFloat(amount.replace(',', '.') 这在以下情况下有效: 1000 -> 1000 1000.1 -> 1000.1 1000,1 -> 1000.1 但是,我有以下两个案例目前不起作用: 1,000.1 -> gives: 1.1 / should

如何正确清理用户输入的货币值

我需要一个大的十进制值,但用户的输入字段是标准文本输入。 我正在尝试格式化字符串,但是,对于用户通常插入的所有变体,我找不到一种干净的方法

我试过这个:

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

如果用户输入一个或多个逗号或点作为十进制分隔符,是否有办法格式化字符串,使其也能工作?

据我所知,代码需要区分十进制分隔符和千位分隔符。只能有一个十进制分隔符,它通常是输入中最后一个“.”或“.”。您只能将字符串中的最后一个“,”替换为“.”,并从输入中删除所有剩余的“,”和“.”。这对于您提供的测试用例是有效的,但是如果用户输入类似100001的内容,并且“,”用作千位分隔符,代码仍然会失败。我认为最好的方法是使用某种类型的输入掩码或表示正确输入值类型的帮助段落。

据我所知,代码需要区分十进制分隔符和千位分隔符。只能有一个十进制分隔符,它通常是输入中最后一个“.”或“.”。您只能将字符串中的最后一个“,”替换为“.”,并从输入中删除所有剩余的“,”和“.”。这对于您提供的测试用例是有效的,但是如果用户输入类似100001的内容,并且“,”用作千位分隔符,代码仍然会失败。在我看来,最好的方法是使用某种类型的输入掩码或表示正确输入值类型的帮助段落。

试试这个

函数解析(str){
if(str.includes('.')&str.includes(',')){
str=str.split(/[,]/)
设last=str.lastIndexOf(‘.)| | str.lastIndexOf(‘,’);
返回parseFloat(str.slice(0,last).join('').replace(/[,]/g',)+'.+str.slice(last))
}
否则返回str.replace(',',');
}
log(解析('1.000,1'))
日志(解析('1000.1'))
log(解析('10000'))
试试这个

函数解析(str){
if(str.includes('.')&str.includes(',')){
str=str.split(/[,]/)
设last=str.lastIndexOf(‘.)| | str.lastIndexOf(‘,’);
返回parseFloat(str.slice(0,last).join('').replace(/[,]/g',)+'.+str.slice(last))
}
否则返回str.replace(',',');
}
log(解析('1.000,1'))
日志(解析('1000.1'))

log(parse('10000'))
以下是我对10个测试用例的工作建议:

const getCorrectValue=(value=0)=>{
返回(“”+值)
.替换(“,”,“.”)
.match(/。\d*/g)
.map((val,i,arr)=>{
返回(ilog('testpass',testCases.map((testCase,i)=>(testCase)`${i}pass`:`${i}fails`))以下是我对10个测试用例的工作建议:

const getCorrectValue=(value=0)=>{
返回(“”+值)
.替换(“,”,“.”)
.match(/。\d*/g)
.map((val,i,arr)=>{
返回(ilog('testpass',testCases.map((testCase,i)=>(testCase)`${i}pass`:`${i}fails`))是否有一个正则表达式可以从另一个方向尝试此操作?例如:检查点或逗号的最后一个实例是否后跟1或2个符号->如果是,则为十进制分隔符,但如果后跟3个符号,则为千分隔符?是否有正则表达式可以从另一个角度尝试此操作?例如:检查点或逗号的最后一个实例是否后跟1或2个符号->如果是,则为十进制分隔符,但如果后跟3个符号,则为千位分隔符?谢谢您的回答!您认为您的解决方案比公认的解决方案更可靠或更快吗?这两种方法似乎都适用于我尝试过的案例,我无法对此进行评估。我刚刚发布了这篇文章,因为我花了大约10分钟的时间来写它,同时被接受的答案突然出现了:)。但我决定发布它,以防你(或其他人)在格式方面有一些在批准的答案中没有考虑的边缘案例。谢谢,我真的很感激!谢谢你的回答!您认为您的解决方案比公认的解决方案更可靠或更快吗?这两种方法似乎都适用于我尝试过的案例,我无法对此进行评估。我刚刚发布了这篇文章,因为我花了大约10分钟的时间来写它,同时被接受的答案突然出现了:)。但我决定发布它,以防你(或其他人)在格式方面有一些在批准的答案中没有考虑的边缘案例。谢谢,我真的很感激!