英文的货币数字采用的是千位分隔符格式,如“12345678”表示为“12,345,678”。下面我们分步讲解如何书写正则表达式。
1) 根据千位把相应的位置替换成“,”,以最后一个逗号为例。解决方法:(?=\d{3}$)。
var result = "12345678".replace(/(?=\d{3}$)/g, ',');
console.log(result); //“12345,678”
其中 (?=\d{3}$) 匹配 \d{3}$ 前面的位置,而 \d{3}$ 匹配的是目标字符串最后 3 为数字。
2) 确定所有的逗号。因为逗号出现的位置,要求后面 3 个数字一组,也就是 \d{3} 至少出现一次。此时可以使用量词 +:
var result = "12345678".replace(/(?=(\d{3}) + $)/g, ',');
console.log(result); //“12,345,678”
3) 匹配其余数字,会发现问题如下:
var result = "123456789".replace(/(?=(\d{3}) + $)/g, ',');
console.log(result); //“,123,456,789”
因为上面的正则表达式,从结尾向前数,只要是 3 的倍数,就把其前面的位置替换成逗号。那么如何解决匹配的位置不能是开头呢?
4) 匹配开头可以使用 ^,但要求该位置不是开头,可以考虑使用 (?!^)。实现代码如下:
var regex= /(?!^)(?=(\d{3}) + $)/g;
var result = "12345678".replace(regex, ',');
console.log(result);
result = "123456789".replace(regex, ',');
console.log(result);
5) 如果要把“12345678 123456789”替换成“12,345,678 123,456,789”,此时需要修改正则表达式,可以把里面的开头^和结尾$修改成 \b。实现代码如下:
var string = "12345678 123456789";
regex = /(?!\b)(?=(\d{3}+\b))/g;
var result = string.replace(regex, ',');
console.log(result); //"12,345,678 123,456,789"
其中 (?!\b) 要求当前是一个位置,但不是 \b 前面的位置,其实 (?!\b) 说的就是 \B。因此最终正则变成了:/\B(?=(\d{3})+\b)/g。
6) 进一步格式化。千分符表示法一个常见的应用就是货币格式化。例如:
1888
格式化为:
$ 1888.00
有了前面的铺垫,可以很容易的实现,具体代码如下:
function format (num) {
return num.toFixed(2).replace(/\B(?=(\d{3})+\b)/g, ",").replace(/^/, "$$");
};
console.log(format(1888));