zoukankan      html  css  js  c++  java
  • 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.网友的正则式法非常简洁漂亮,还有字符串分隔成单字符反序拼接法等。

  • 相关阅读:
    ASP.NET MVC分部类的使用
    窗体初始化完毕后隐藏窗体
    让每个用户都有同样的输入法配置
    昨夜的失眠--从数据备份所想到的.
    电子书下载
    Microsoft .Net 框架 SDK 快速入门教程
    .net书籍代码下载 [雪冬寒'Blog]
    VISUAL C#.NET中文版WEB服务开发基础
    Citrix相关技术
    OA在线试用
  • 原文地址:https://www.cnblogs.com/hdwang/p/13414822.html
Copyright © 2011-2022 走看看