首页 > 编程笔记 > JavaScript笔记 > JS正则表达式

JS正则表达式匹配货币数字

英文的货币数字采用的是千位分隔符格式,如“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));

所有教程

优秀文章