RegEx用于替换字符串(如果其包含两个以上的小数)

时间:2019-05-30 15:37:43

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

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

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

问题:

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

类似的东西:

  • 5没关系
  • 5,可以,因为它正在等待小数位
  • 5,5没关系
  • 5,55没关系
  • 5,555这不行,我想删除最后一位并返回到5,55
  • 5,555555555555也不行,用户可能会粘贴一些带有多余小数位的内容,我想将它们的大小最多缩减为2个小数,然后再返回到5,55

我该怎么做?

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

但是我怎么用逗号后的前两位代替?

2 个答案:

答案 0 :(得分:4)

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

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

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

说明

  • ^开始strig
  • (捕获组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")));

答案 1 :(得分:2)

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

let str = '1,567895'; // price value

let val = parseFloat(str.replace(',', '.')).toFixed(2).replace('.', ',');
console.log(val);