正則實現數字的千位分隔符表示法


原文鏈接: https://www.cnblogs.com/yalong/p/15183715.html

比如把 12345678,變成 12,345,678
可見是需要把相應的位置替換成 ,

方法一

先弄出最后一個逗號

使用 (?=\d{3}$)就可以做到:

var result = "12345678".replace(/(?=\d{3}$)/g, ',')
console.log(result);
  // => "12345,678"

其中(?=\d{3}$) 匹配 \d{3}$ 前面的位置。而 \d{3}$ 匹配的是目標字符串最后那 3 位數字。

弄出所有的逗號

因為逗號出現的位置,要求后面 3 個數字一組,也就是 \d{3} 至少出現一次。 此時可以使用量詞 +:

var result = "12345678".replace(/(?=(\d{3})+$)/g, ',')
console.log(result);
// => "12,345,678"

寫完正則后,要多驗證幾個案例,此時我們會發現問題:

 var result = "123456789".replace(/(?=(\d{3})+$)/g, ',')
 console.log(result);
 // => ",123,456,789"

因為上面的正則,僅僅表示把從結尾向前數,一但是 3的倍數,就把其前面的位置替換成逗號。
因此才會出 現這個問題。
怎么解決呢?
我們要求匹配的到這個位置不能是開頭。
我們知道匹配開頭可以使用 ^,但要求這個位置不是開頭怎么辦?
(?!^) 就可以實現

  var regex = /(?!^)(?=(\d{3})+$)/g;
  var result = "12345678".replace(regex, ',')
  console.log(result);
  // => "12,345,678"
  result = "123456789".replace(regex, ',');
  console.log(result);
  // => "123,456,789"

那如果要支持帶小數點的數呢,比如 123456.12 轉成 123,456.12
只需稍作處理即可,如下:

var regex = /(?!^)(?=(\d{3})+(\.|$))/g;
"123456.12".replace(regex, ','); // "123,456.12"

就只是加個限制 ?=(\d{3})+ 的后面是結束符 或者點號
驗證如下:

var regex = /(?!^)(?=(\d{3})+(\.|$))/g;
"123456.12".replace(regex, ','); // "123,456.12"
"123456".replace(regex, ','); // "123,456"

方法二

先看代碼:

'12345.12'.replace(/\d{1,3}(?=(\d{3})+(\.|$))/g, '$&,'); // "12,345.12"
'312345.12'.replace(/\d{1,3}(?=(\d{3})+(\.|$))/g, '$&,'); // "312,345.12"
'312345'.replace(/\d{1,3}(?=(\d{3})+(\.|$))/g, '$&,'); // "312,345"

實現思路拆解

  • \d{1,3} 代表1到三位的數字,
  • (?=(\d{3})+(\.|$)) 是三位數字並且后面是點號或者結束的字符串
  • $& 是匹配到的子串
  • '$&,'就是吧匹配到的子串加個逗號


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM