blog-md
blog-md copied to clipboard
js 正则の千位分隔符
可以针对正负号,整数及小数做匹配,研究了四分之三个上午,猝不及防在实验室漏水成水帘洞之际赶紧记录~
只有正整数
输入 | 期待输出 |
---|---|
123456 | 123,456 |
123 | 123 |
1234 | 1,234 |
只有正整数的时候那真是轻松加愉快,一行正则就可以搞定。
参考文章中匹配的是逗号应该在的位置,我自己当时是想匹配逗号左边的那个数字进行替换,两种方法都写出来:
// 1.替换(逗号)左边的数字为数字+都好
str.repalce(/(\d)(?=(\d{3})+$)/g,'$1,')
// 2.第二种方法,参考文章只匹配要找的位置
str.replace(/(?=(?!^)(\d{3})+$)/g, ',')
两种方法都要注意,如果不加$
这个结尾符,因为全局匹配的关系,123456会输出成1,2,3,456,是我第一次错的地方。
?=
代表后面紧跟的字符匹配,此次匹配才算成功。
第二种写法要注意(?!^)代表不能是起始位置,?!
和?=
意思正好相反。表示后面紧跟的字符不匹配,此次匹配返回 true。
增加小数位及正负号
测试用例 | 输出结果 |
---|---|
123456 | 123,456 |
123456.1234 | 123,456.1234 |
-123456 | -123,456 |
-123456.1234 | -123,456.1234 |
首先正则表达式有些引擎是支持逆序环视匹配的,可以从指定位置向前匹配,幸运的是 JS 并不支持,所以另想办法。
我们要做的就是把整数部分匹配出来,每三位插入一个逗号即可。
这样的话一行正则替换是有点困难了,好在 repalce 方法第二个参数可以是一个函数,对匹配的字符处理返回。
function milliFormat(num) {
return num && num.toString()
.replace(/\d+/, function(s){
return s.replace(/(\d)(?=(\d{3})+$)/g, '$1,')
})
}
总结
怎么看待正则表达式?
一点都不想看。
参考
今天也对有小数点的很头疼,找到了一个正则就出来的:(?<=\b(?<!.)\d*)\B(?=(\d{3})+(?=\b))