前言

我们看一道题目

实现一个函数输入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
2
var a = 123456789;
a.toLocaleString();//"123,456,789"

解法三,new Intl.NumberFormat().format()

这个函数能提供特定区域设置的数字格式,默认是 en-US

1
2
3
var num = 123456789;
new Intl.NumberFormat().format(num);
//"123,456,789"

这个函数还能设置其他地区的数字的显示,具体可以参考 MDN