实现
将一个数字转换为千分位的金额格式,找了酱一个正则表达式。
var num =12345;
console.log ((num.toFixed(2) + '').replace(/\d{1,3}(?=(\d{3})+(\.\d*)?$)/g, '$&,'));
解析
一点点来看这个正则式什么意思。
toFixed(2) : 数字保留2位小数。
\d{1,3} : 包含1个或者3个数字的字符串。(为简便表述,这个字符串先记做A)
\d{3} : 包含3个数字
(\d{3})+ : 包含至少1个的3个数字的组合
(.\d*)?$ : 以小数点以及其n位数字为结尾
(\d{3})+(.\d*)?$ : 小数点前至少1个3个数组,小数点后有n为数字的字符串(为简便表述,这个字符串先记做B)
?=(\d{3})+(.\d*)?$ : 找出任何其后紧接指定字符串B的字符串A
/g : 全局匹配
$&, : 当前匹配的字符串,集合上面的,这个匹配字符串为A,并将A后面加个逗号“,”
字面的意思就酱了。
验证
我们举几个例子来验证一下。
假设num 是2位数或1位数,那么字符串B是为空的,不做逗号替换,直接返回;
num是3位数,则B = num,但是字符串A是空的,不做逗号替换,直接返回。
num是4,5位数,B是后三位,A是B前一位,找到这样的A,对A进行逗号替换。然后继续找,发现找不到了。
num是6位数,B = num, 找不到A,继续, B = num的后三位,找到A是B的前一位,加逗号。
num是7位数(1234567),B = num的后六位(234567),A是第一位(1),加逗号,此时结果为(1,234567).
再继续查找,B是567,找到A是4,加逗号,结果为(1,234,567).这就递归num是6为数的情况了。
我们先找字符串B为345.00,然后找到2是满足字符串A的要求的。2后面加逗号。
g 继续找,发现没有了,结果是12,345.00;
话说其实试验下来发现字符串A可以直接是\d{1}
PS:
正则中$1,$2,$3,..$99,代表第1,2,3,…99匹配的字符串。
$’代表当前匹配字符串后面的字符串。
$`代表当前匹配字符串前面的字符串。
比如字符串“Hello,World”, 匹配字符串为”,”的话,$`代表“Hello”,$’代表“World”