货币数字千分位分割正则 JavaScript 千分位分割

432 阅读1分钟

货币数字千分位分割

给个数字9123456789.123456

要小数点前面用逗号分割三个一组

9,123,456,789.123456

'-1019234801211.2142345678'.replace(/(?<!.*\..*)(\d)(?=(\d{3})+($|\.))/g, '$1,')

先说这段正则 /\d(?=(\d{3})+($|.))/g 这个是匹配一个数字 数字的后面是三个数字一组最少一组 在这后面是点或者是空白 全局匹配

全局匹配的意思就是

如果有这样的数字1234567.1

匹配到的是三个一组后面是点的 4 1 因为4的后面有一组三个数字加点567.

1的后面有两组数字加点 234 567 .

所以全局匹配到1和4 在1上面换成1, 4换成4,

这样就变成 1,234,567.1

但是这个正则有个问题就是如果小数点后面有超过三位也会匹配如:1234.1234就会变成1,234.9,876 因为小数点后面也符合了876一组数字后面是空白 前面是数字1 那么9变成了9,了

怎么解决这个问题呢。

先行断言保证了 数字后面是大于一组3个数字加点或者空白 那么后行断言 保证一下匹配的前面不能有点就好了 这样就不能匹配到小数点后面的数字了 那么就用到了零宽否定后行断言 ?<!

image.png

.代表任意字符(除了换行符).代表点 这里面的小数点 .代表任意字符(除了换行符) 任意字符我们要任意次数 这里面在.后面加上*

所以否定后行断言为

(*** ?<!. ..*****) 代表前面不能是任意数量的任意字符加点和任意数量的任意字符组成 这样就写好了

/(****?<!.*\..*****)(\d)(?=((\d{3})+($|\.)))/g
断言(?=)这个是个整体 就不用加括号了
/(?<!.*\..*)(\d)(?=(\d{3})+($|\.))/g
         

这题还可以用js把小数点前后分开 创建一个空数组 遍历小数点前面的字符串 从后往前 遍历一次计数一次 计数到3的倍数的时候加逗号 不断往新创建的数组里面塞 遍历到最后再翻转 就可以了。