代码
const formatNum = (num) => (num || 0).toString().replace(/\d(?=(\d{3})+\b)/g, '$&,')
解析
看完代码是不是一脸懵逼,别急,我们只要把 ?=
和 $&
弄明白(\d
等不会的话查查 mdn 即可),这个表达式也就能看懂了。
先看个简单的吧,$&
表示整个用于匹配的原字符串,也就是说匹配到啥,它就代表啥。如果正则表达式匹配到 ‘abc’,那么 $&
就代表 ‘abc’,简单吧?
那剩下的 ?=
,我们看看 mdn
(?:x)
匹配’x’仅仅当’x’后面跟着’y’.这种叫做先行断言。
例如,/Jack(?=Sprat)/会匹配到’Jack’仅当它后面跟着’Sprat’。/Jack(?=Sprat|Frost)/匹配‘Jack’仅当它后面跟着’Sprat’或者是‘Frost’。但是‘Sprat’和‘Frost’都不是匹配结果的一部分。
看个两遍就能懂了
那还有个问题,/\d(?=(\d{3})+\b)/g
到底匹配到的是什么呢?我们拿 123456789
来做匹配,那么它匹配到的就是数字 3
和 6
为什么呢?我们来看看这个表达式,首先 \b
代表匹配一个数字,?=
代表数字后面需要跟着 (\d{3})+\b
(1到多串 3个连着的数字,并以一个三数字为边界),所以 3
后面跟着 456789
,两串 3个连着的数字;6
后面跟着 789
,一串 3个连着的数字。
最后,通过 replace
给匹配到的 3
和 6
的后面都加上逗号,即可。
废话至此,希望能帮到你。