如果字符串包含超过 2 位小数,则用于替换字符串的正则表达式
RegEx for replacing a string if it contains more than 2 decimals
我有这个用户价格输入,我想允许 0、1 或 2 个小数位。
- 我用逗号表示小数。
- 我没有使用也不允许使用千位分隔符。
问题:
如果用户输入第三位小数,我想替换输入。
类似于:
5
这样就可以了
5,
没关系,因为它在等待小数
5,5
这个可以
5,55
这个可以
5,555
这不行,我想删除最后一位并返回 5,55
5,555555555555
这也不行,用户可能会粘贴带有额外小数位的内容,我想 trim 它们最多保留 2 位小数,再次返回到 5,55
我该怎么做?
我知道如何匹配字符串的结尾:/[,\d+]$/
但是如何替换逗号后的前两位数呢?
您的模式 [,\d+]$
将匹配逗号、数字或加号并断言字符串的结尾。
您可以在一组中捕获 1+ 个数字、一个可选的逗号和 0-2 个数字。之后匹配0+个数字并替换为第1组。
^(\d+,?\d{0,2})\d*$
说明
^
字符串开始
(
捕获组 1
\d+
1+ 位数
,?
可选逗号
\d{0,2}
0 - 2 位数
)
关闭群组
\d*
匹配 0+ 个数字
$
断言字符串结束
如果要保留小数点前的部分,可以使用捕获组^(\d+),?\d{0,2}$
并替换为第一个捕获组:
[
"5",
"5",
"5,0",
"5,00",
"5,000"
].forEach(s => console.log(s.replace(/^(\d+,?\d{0,2})\d*$/, "")));
您总是可以暂时将逗号转换为句点,解析浮点数并将其固定为 2 位小数,然后再次将句点替换为逗号,如下所示;
let str = '1,567895'; // price value
let val = parseFloat(str.replace(',', '.')).toFixed(2).replace('.', ',');
console.log(val);
我有这个用户价格输入,我想允许 0、1 或 2 个小数位。
- 我用逗号表示小数。
- 我没有使用也不允许使用千位分隔符。
问题:
如果用户输入第三位小数,我想替换输入。
类似于:
5
这样就可以了5,
没关系,因为它在等待小数5,5
这个可以5,55
这个可以5,555
这不行,我想删除最后一位并返回5,55
5,555555555555
这也不行,用户可能会粘贴带有额外小数位的内容,我想 trim 它们最多保留 2 位小数,再次返回到5,55
我该怎么做?
我知道如何匹配字符串的结尾:/[,\d+]$/
但是如何替换逗号后的前两位数呢?
您的模式 [,\d+]$
将匹配逗号、数字或加号并断言字符串的结尾。
您可以在一组中捕获 1+ 个数字、一个可选的逗号和 0-2 个数字。之后匹配0+个数字并替换为第1组。
^(\d+,?\d{0,2})\d*$
说明
^
字符串开始(
捕获组 1\d+
1+ 位数,?
可选逗号\d{0,2}
0 - 2 位数
)
关闭群组\d*
匹配 0+ 个数字$
断言字符串结束
如果要保留小数点前的部分,可以使用捕获组^(\d+),?\d{0,2}$
并替换为第一个捕获组:
[
"5",
"5",
"5,0",
"5,00",
"5,000"
].forEach(s => console.log(s.replace(/^(\d+,?\d{0,2})\d*$/, "")));
您总是可以暂时将逗号转换为句点,解析浮点数并将其固定为 2 位小数,然后再次将句点替换为逗号,如下所示;
let str = '1,567895'; // price value
let val = parseFloat(str.replace(',', '.')).toFixed(2).replace('.', ',');
console.log(val);