【问题标题】:Javascript - clean user inputted money valueJavascript - 干净的用户输入的货币价值
【发布时间】:2019-02-20 12:42:17
【问题描述】:

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

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

我试过这个:

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

有没有办法格式化字符串,以便在用户输入一个或多个逗号或点作为十进制分隔符时它也可以工作?

【问题讨论】:

    标签: javascript parsing numbers


    【解决方案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】:

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

      【讨论】:

      • 是否有正则表达式可以反过来尝试?例如:检查点或逗号的最后一个实例是否后跟 1 或 2 个符号 -> 如果是,则为小数分隔符,但如果后跟 3 个符号,则为千位分隔符?
      【解决方案3】:

      这是我对 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`));

      【讨论】:

      • 感谢您的回答!您认为您的解决方案比公认的解决方案更可靠或更快速吗?两者似乎都适用于我尝试过的案例。
      • 我无法评估。我刚刚发布了这个,因为我花了大约 10 分钟的时间来写它,同时弹出了接受的答案:)。但是我决定发布它以防万一您(或其他人)在格式方面有一些边缘情况,而这些情况在批准的答案中没有考虑到。
      • 谢谢,非常感谢!
      猜你喜欢
      • 2014-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多