英文的貨幣數位採用的是千位分隔符格式,如“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));