正则实现数字的千位分隔符表示法
原文链接: https://www.cnblogs.com/yalong/p/15183715.html
比如把 12345678
,变成 12,345,678
可见是需要把相应的位置替换成 ,
方法一
先弄出最后一个逗号
使用 (?=\d{3}$)
就可以做到:
var result = "12345678".replace(/(?=\d{3}$)/g, ',')
console.log(result);
// => "12345,678"
其中(?=\d{3}$)
匹配 \d{3}$
前面的位置。而 \d{3}$
匹配的是目标字符串最后那 3 位数字。
弄出所有的逗号
因为逗号出现的位置,要求后面 3 个数字一组,也就是 \d{3} 至少出现一次。 此时可以使用量词 +:
var result = "12345678".replace(/(?=(\d{3})+$)/g, ',')
console.log(result);
// => "12,345,678"
写完正则后,要多验证几个案例,此时我们会发现问题:
var result = "123456789".replace(/(?=(\d{3})+$)/g, ',')
console.log(result);
// => ",123,456,789"
因为上面的正则,仅仅表示把从结尾向前数,一但是 3的倍数,就把其前面的位置替换成逗号。
因此才会出 现这个问题。
怎么解决呢?
我们要求匹配的到这个位置不能是开头。
我们知道匹配开头可以使用 ^,但要求这个位置不是开头怎么办?
(?!^)
就可以实现
var regex = /(?!^)(?=(\d{3})+$)/g;
var result = "12345678".replace(regex, ',')
console.log(result);
// => "12,345,678"
result = "123456789".replace(regex, ',');
console.log(result);
// => "123,456,789"
那如果要支持带小数点的数呢,比如 123456.12 转成 123,456.12
只需稍作处理即可,如下:
var regex = /(?!^)(?=(\d{3})+(\.|$))/g;
"123456.12".replace(regex, ','); // "123,456.12"
就只是加个限制 ?=(\d{3})+
的后面是结束符 或者点号
验证如下:
var regex = /(?!^)(?=(\d{3})+(\.|$))/g;
"123456.12".replace(regex, ','); // "123,456.12"
"123456".replace(regex, ','); // "123,456"
方法二
先看代码:
'12345.12'.replace(/\d{1,3}(?=(\d{3})+(\.|$))/g, '$&,'); // "12,345.12"
'312345.12'.replace(/\d{1,3}(?=(\d{3})+(\.|$))/g, '$&,'); // "312,345.12"
'312345'.replace(/\d{1,3}(?=(\d{3})+(\.|$))/g, '$&,'); // "312,345"
实现思路拆解
\d{1,3}
代表1到三位的数字,(?=(\d{3})+(\.|$))
是三位数字并且后面是点号或者结束的字符串$&
是匹配到的子串'$&,'
就是吧匹配到的子串加个逗号