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