以下先說明數字加上千分位的規則:
- 數字的整數部分每3位數插入一個逗號(,), ex: 123456 –> 123,456
- 小數點後不加入千分位, ex: 123456.1234 –> 123,456.1234
所以一開始會有人寫成以下這樣的Regex Pattern:
1 | "1234567" .replace(/(\d{1,3})(?=(\d{3})+)/g, "$1," ); |
原因在於以下的比對步驟:
- 因為是比對 (\d{1,3})(?=(\d{3})+), 所以第一個比對到的會是1234, 12345, 123456.
- 由於是用(\d{1,3}), 取最長的3字元, 所以是123456被轉換成123,.
- 接下來, 比對到4567, 所以被轉換成4,.
- 最後結果就變成123,4,567
1 | "1234567" .replace(/(\d{1,3})(?=(\d{3})+$)/g, "$1," ); |
1 | "1234567.654321" .replace(/(\d{1,3})(?=(\d{3})+$)/g, "$1," ); |
多了一個小數點, 整數部分便完全不是我們要的格式, 且小數部分反而被加上千分位了.
再回頭看lookahead的部分, 我們是希望小數點前的數字可以被比對成功, 小數後不可被替換.
所以改成以下的方式:
1 | "1234567.654321" .replace(/(\d{1,3})(?=(\d{3})+\.)/g, "$1," ); |
但這個Regex Pattern不能套用在整數上, 因為整數無小數點.
結論:
1 2 3 4 | //整數用 "1234567" .replace(/(\d{1,3})(?=(\d{3})+$)/g, "$1," ); //浮點數用 "1234567.1234" .replace(/(\d{1,3})(?=(\d{3})+\.)/g, "$1," ); |
沒有留言:
張貼留言