blog-md icon indicating copy to clipboard operation
blog-md copied to clipboard

js 正则の千位分隔符

Open jiangjiu opened this issue 8 years ago • 1 comments

可以针对正负号,整数及小数做匹配,研究了四分之三个上午,猝不及防在实验室漏水成水帘洞之际赶紧记录~

只有正整数

输入 期待输出
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,')
         })
}

总结

怎么看待正则表达式?

一点都不想看。

参考

正则表达式千位分隔符复杂攻略

用JS正则现实千位分隔符插入

司徒正美的正则表达式讲解

jiangjiu avatar Aug 03 '16 03:08 jiangjiu

今天也对有小数点的很头疼,找到了一个正则就出来的:(?<=\b(?<!.)\d*)\B(?=(\d{3})+(?=\b))

qiqihaobenben avatar Nov 29 '19 10:11 qiqihaobenben