前言
我们看一道题目
实现一个函数输入123456789,输出123,456,789
解法一,正则表达式
str.replace(/(\d)(?=(?:\d{3})+$)/g,'$1,')
其中 (?:\d{3})
叫作非捕获括号,匹配 \d{3}
但是不记住匹配项。然后它被正向肯定查找包裹住: (?=(?:\d{3})+$)
,(?=)
这就是正向肯定查找,会匹配到 \d
仅仅当它后面跟着 (?:\d{3})+$
,且不会把 (?:\d{3})+$
当做匹配的内容。最后就是 $1,
,由于我们是用字符串的 replace
方法,它接受两个参数,第一个是正则表达式,第二个是替换的内容,而正则表达式由 ()
匹配的内容,可以用 $1
来表示第一个 ()
匹配的内容,所以替换后就是在匹配的数字后面加上 ,
。整个流程就是,匹配数字((\d)
),仅仅当这个数字后面((?=)
)有一个或多个三个数字的组合并以数字结尾((?:\d{3})+&
),匹配到就替换数字为原来的匹配项加上逗号。
解法二,toLocaleString()
这个是字符串的方法,我一开始是用在转化时间为本地时间的,没想到还能用上千位分隔符。1
2var a = 123456789;
a.toLocaleString();//"123,456,789"
解法三,new Intl.NumberFormat().format()
这个函数能提供特定区域设置的数字格式,默认是 en-US
。1
2
3var num = 123456789;
new Intl.NumberFormat().format(num);
//"123,456,789"
这个函数还能设置其他地区的数字的显示,具体可以参考 MDN