将数字转换为千分位的金额格式

实现

将一个数字转换为千分位的金额格式,找了酱一个正则表达式。

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”