js實現數字轉換為逗號分隔的格式化字符串


 

//注意:數字與字符的轉換會丟失多余的尾部0('123.010'<->123.01,'123.00'<->123)
var NumberFormat = {
    //按照每3位逗號分隔,字符串截子串法
    toCommaFormat: function(number){
        //如果是數字,則轉換為字符串
        if(typeof number == 'number'){
            number = String(number)
        }
        
        var pointIndex = number.lastIndexOf('.'); //獲取小數點的位置
        var hasDecimal = pointIndex != -1; //檢查是否包含小數點
        var numberInteger = hasDecimal ? number.substring(0, pointIndex) : number; //獲取數的整數部分
        var length = numberInteger.length;
        if(length > 3){
            var numberFormat = '';
            //從尾部往前截子串拼接
            for(var i= numberInteger.length; i> 0; i=i-3){
                //當前子串+之前拼接好的子串(因:substring(0,1) == substring(-2,1),故無需判斷i-3為負數的情況)
                numberFormat = numberInteger.substring(i-3,i) + (numberFormat==''?'':(','+numberFormat));
            }
            //整數部分+小數部分
            var numberDecimal = hasDecimal ? number.substring(pointIndex) : '';
            return numberFormat + numberDecimal;
        }else{
            //無需分隔,直接返回
            return number;
        }
    },
    //按照每3位逗號分隔,余數拼接法(缺點:有位數限制)
    toCommaFormat2: function(number){
        //如果是數字,則轉換為字符串
        if(typeof number == 'number'){
            number = String(number)
        }
        
        var pointIndex = number.lastIndexOf('.'); //獲取小數點的位置
        var hasDecimal = pointIndex != -1; //檢查是否包含小數點
        var numberInteger = hasDecimal ? number.substring(0, pointIndex) : number; //獲取數的整數部分
        var length = numberInteger.length;
        if(length > 3){
            var numberFormat = '';
            var remainder; //余數
            var quotient; //
            while(true){ 
                quotient = Math.floor(Number(numberInteger)/1000); //商標識還需不需要進一步分隔
                remainder = Number(numberInteger)%1000; //余數即是分隔下來的子串
                numberFormat = String(remainder) + (numberFormat == ''?'':(','+numberFormat)); //當前余數拼接之前的余數
                if(quotient == 0){
                    //商為0,計算完畢
                    break;
                }
                //商作為被除數,進一步分隔
                numberInteger =  quotient; 
            }
            //整數部分+小數部分
            var numberDecimal = hasDecimal ? number.substring(pointIndex) : '';
            return numberFormat + numberDecimal;
        }else{
            //無需分隔,直接返回
            return number;
        }
        
    },
    //正則式替換,來自網友
    format_number:function(nStr ){
        nStr += '';  //數字轉換為字符 
        x = nStr.split('.');  //按照小數點分隔
        x1 = x[0];  //整數部分
        x2 = x.length > 1 ? '.' + x[1] : '';  //小數部分
        var rgx = /(\d+)(\d{3})/;  //正則式定義
        while (rgx.test(x1)) {  //正則式匹配
            x1 = x1.replace(rgx, '$1' + ',' + '$2');   //正則式替換
        }  
        return x1 + x2;  
    } 
    
};

 

總結:

1.推薦使用字符串截子串的方式進行格式化,這樣沒有長度限制。

2.調用函數傳參最好使用字符串類型,這樣才不會丟失尾部的0。

3.網友的正則式法非常簡潔漂亮,還有字符串分隔成單字符反序拼接法等。

 


免責聲明!

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



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