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));

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/23089.html

(0)
上一篇 2021年7月20日 11:00
下一篇 2021年7月20日 11:00

相关推荐

发表回复

登录后才能评论