JS格式化數字1234567890 --> 1,234,567,890


數字格式化 1234567890 --> 1,234,567,890

1.普通版

function formatNumber(str) {
  let arr = [],
    count = str.length

  while (count >= 3) {
    arr.unshift(str.slice(count - 3, count))
    count -= 3
  }

  // 如果是不是3的倍數就另外追加到上去
  str.length % 3 && arr.unshift(str.slice(0, str.length % 3))

  return arr.toString()

}
console.log(formatNumber("1234567890")) // 1,234,567,890

優點:自我感覺比網上寫的一堆 for循環 還有 if-else 判斷的邏輯更加清晰直白。
缺點:太普通

2.進階版

function formatNumber(str) {

  // ["0", "9", "8", "7", "6", "5", "4", "3", "2", "1"]
  return str.split("").reverse().reduce((prev, next, index) => {
    return ((index % 3) ? next : (next + ',')) + prev
  })
}

console.log(formatNumber("1234567890")) // 1,234,567,890

優點:把 JS 的 API 玩的了如指掌
缺點:可能沒那么好懂,不過讀懂之后就會發出我怎么沒想到的感覺

3.正則版

function formatNumber(str) {
  return str.replace(/\B(?=(\d{3})+(?!\d))/g, ',')
}

console.log(formatNumber("123456789")) // 1,234,567,890

下面簡單分析下正則/\B(?=(\d{3})+(?!\d))/g

第一 /\B(?=(\d{3})+(?!\d))/g:正則匹配邊界\B,邊界后面必須跟着(\d{3})+(?!\d);
第二 (\d{3})+:必須是1個或多個的3個連續數字;
第三 (?!\d):第2步中的3個數字不允許后面跟着數字;
第四 (\d{3})+(?!\d):所以匹配的邊界后面必須跟着3*n(n>=1)的數字。

最終把匹配到的所有邊界換成,即可達成目標。

優點:代碼少,濃縮的就是精華
缺點:需要對正則表達式的位置匹配有一個較深的認識,門檻大一點

4.API版

(123456789).toLocaleString('en-US')  // 1,234,567,890

你可能還不知道 JavaScripttoLocaleString 還可以這么玩。

還可以使用 Intl對象 - MDN

Intl 對象是 ECMAScript 國際化 API 的一個命名空間,它提供了精確的字符串對比,數字格式化,日期和時間格式化。Collator,NumberFormat 和 DateTimeFormat 對象的構造函數是 Intl 對象的屬性。

new Intl.NumberFormat().format(1234567890) // 1,234,567,890

優點:簡單粗暴,直接調用 API
缺點:Intl兼容性不太好,不過 toLocaleString的話 IE6 都支持

你可能不知道的前端知識點:Intl對象 和 toLocaleString的方法。

站在巨人肩膀上摘蘋果

https://github.com/jawil/blog/issues/30


免責聲明!

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



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