數字每三位添加一個 ',' 的不同實現方式

處理數值,爲每三位數加一個逗號,兼容浮點型數值

1234567.123412345678爲例

  • 通過內置方法實現
    function addComma(num = 0){
        let temps = num.toString().split('.'), //處理浮點數的情況,整數時會返回原數值
            target = temps[0].split('').reverse(), //倒序
            lastIndex = target.length;
        return target.map((item,index) => { 
                        //第三個就增加一個',',要注意最後一個數字不添加
                        return ((index+1) % 3 === 0 && (index !== lastIndex - 1)) ? (','+ item) : item;
                    })
                    .reverse() //倒序回來
                    .join('') + (temps[1] ? '.' + temps[1] : ''); //如果是浮點數,就再加上小數部分
    }

    addComma(1234567.1234) //1,234,567.1234
    addComma(12345678)     //12,345,678
  • 通過正則表達式
    function addComma(num = 0){
        let reg = num.toString().indexOf('.') > -1 ? /(\d)(?=(\d{3})+\.)/g : /(\d)(?=(\d{3})+$)/g;

        return num.toString().replace(reg,'$1,');
    }

    addComma(1234567.1234) //1,234,567.1234
    addComma(12345678)     //12,345,678

利用正則表達式來處理的思路:

  • 整數和浮點數是有差別的,整數從最右邊開始算,浮點數要從小數點'.'開始算
  • 字符串分爲兩部分,右邊是3*n位數字,左邊的部分添加','。n = {1,}

右邊的部分很好匹配:/(\d{3})+/ , 再加上開始算的符號,浮點數要加上 \..匹配除換行符之外的任何單個字符,加上\.轉義,就是匹配'.')。整數加上$結束符。

左邊的部分,必須依賴於右邊的部分。比如說必須右邊有三位,左邊纔會匹配成功,加一個','。就需要用到?=正向肯定查找(x(?=y)僅當x後面跟着y時纔會匹配x)。(\d)(?=y) y就是右邊的部分。

再加上全局搜索的標誌 g,不然只會匹配一組,只加一個','。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章