【问题标题】:RegEx for replacing a string if it contains more than 2 decimalsRegEx 用于替换包含超过 2 个小数的字符串
【发布时间】:2019-05-30 15:37:43
【问题描述】:

我有这个用户价格输入,我希望允许 0、1 或 2 个十进制数字。

  • 我使用逗号表示小数。
  • 我没有使用也不允许使用千位分隔符。

问题:

如果用户输入第三个十进制数字,我想替换输入。

有点像:

  • 5 没关系
  • 5, 这没关系,因为它正在等待小数
  • 5,5 没关系
  • 5,55 没关系
  • 5,555 这不行,我想删除最后一位并返回到5,55
  • 5,555555555555 这也不行,用户可能会粘贴带有额外十进制数字的内容,我想将它们最多修剪为 2 位小数,然后再回到 5,55

我该怎么做?

我知道如何匹配字符串的结尾:/[,\d+]$/

但是如何用逗号后的前两位数字替换?

【问题讨论】:

    标签: javascript regex replace regex-lookarounds regex-group


    【解决方案1】:

    您的模式[,\d+]$ 将匹配逗号、数字或加号并断言字符串的结尾。

    您可以在一组中捕获 1+ 个数字、一个可选的逗号和 0-2 个数字。然后匹配 0+ 个数字并替换为第 1 组。

    ^(\d+,?\d{0,2})\d*$
    

    说明

    • ^ 字符串开始
    • (捕获组1
      • \d+ 1+ 位
      • ,? 可选逗号
      • \d{0,2} 0 - 2 位数
    • )关闭群
    • \d* 匹配 0+ 个数字
    • $断言字符串结束

    Regex demo

    如果要保留小数点前的部分,可以使用捕获组^(\d+),?\d{0,2}$ 并替换为第一个捕获组:

    [
      "5",
      "5",
      "5,0",
      "5,00",
      "5,000"
    ].forEach(s => console.log(s.replace(/^(\d+,?\d{0,2})\d*$/, "$1")));

    【讨论】:

    • 谢谢。但是我怎样才能使用那个匹配来替换我的字符串并去掉多余的小数呢?
    • @GrafiCodeStudio 我想你错过了^
    • 对不起,如果我不是很清楚。在你的例子中,我只会更改5,000,我会变成5,00。任何超过两位小数的都应该回到 2。
    • @cbdev420 我明白了,我已经更新了模式和演示。
    • 正是我想要的。谢谢!
    【解决方案2】:

    您总是可以暂时将逗号转换为句点,解析浮点数并将其固定为 2 位小数,然后再次用逗号替换句点,如下所示;

    let str = '1,567895'; // price value
    
    let val = parseFloat(str.replace(',', '.')).toFixed(2).replace('.', ',');
    console.log(val);

    【讨论】:

    • 有效!但我希望仅通过操作字符串来解决这个问题。谢谢。
    • @cbdev420 不用担心,有道理!但是,请注意,一旦您拥有正确数量的数字,您就必须处理四舍五入,如果您将其用作价格,请将没有小数的数字(即 5)转换回 5,00。
    猜你喜欢
    • 1970-01-01
    • 2016-04-20
    • 2019-09-10
    • 1970-01-01
    • 2020-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多