js金额格式化

开发中,经常前端与后台是有约定金额格式,但有时后台人员不遵守规则,经常返回的金额不按格式返回,导致前端显示格式不统一被测试人员反馈成bug。

比如约定的金额同一个格式是元单位 0.00,后台却返回 0元 1元,必须前端开发人员格式成0.00,1.00之类的。

下面自己撸的一个对元单位金额进行格式,欢迎测试。

/*
功能:对非标准0.00的元金额格式化成标准0.00格式
测试用例:
0/1/123/ => 0.00/1.00/123.00
0.12/0.2 => 0.12/0.20
123./0./1. => 123.00/0.00/1.00
.1/.12/ => 0.10/0.12
.123 => 0.12 
*/
function formatYuan(yuanMoney){

    if (typeof(yuanMoney) == "undefined"){
      return "0.00";
    }

    yuanMoney = yuanMoney + "";
    var yuanAmt = yuanMoney.trim();
    
    var reg = /^-?\d*(\.)?\d*?$/
    if( !reg.test(yuanAmt) ){
        //过滤: 非-或数字开头的,多个点的
        console.log('test1 fails=>' + yuanAmt);
        return yuanAmt;
    }
    
    if( yuanAmt == '' || yuanAmt == '-' || yuanAmt == '.' || yuanAmt == '-.' ){
        // 过滤:特殊字符, - . -.
        console.log('test2 fails=>' + "0.00");
        return "0.00";
    }
    
    var ltZero = '';
    if( yuanAmt.charAt(0) == '-' ){
        // 拆开负号
        ltZero = '-';
        yuanAmt = yuanAmt.substr(1);
        console.log('hit start - =>' + yuanAmt);
    }
        
    // xxx. xxx.x xxx.xx xxx.xxx 009.2 0.9 || .x .xx .xxx 
    //reg = /^-?\d+\.\d*$/
    //if( reg.test(yuanAmt) || /^-?\.\d*$/.test(yuanAmt) ){
    if( /^\d*\.\d*$/.test(yuanAmt) ){
        // 处理:以小数点拆整数、小数判断
        console.log("hit xxx.(xxx) =>" + yuanAmt);
        
        var idx = yuanAmt.indexOf('.'); // here must have dot
        //var step = yuanAmt.length - idx;
        
        var dotBefore = yuanAmt.substring(0,idx);
        var dotAfter = yuanAmt.substring(idx+1,yuanAmt.length);
        
        console.log('idx=' + idx );//+ ',step=' + step);
        console.log('before=' + dotBefore + ',after=' + dotAfter);
        
        switch(dotBefore.length){
            case 0:
                dotBefore = "0";
                break;
            case 1:
                break;
            default:
                // 去除多余的前导0
                dotBefore = dotBefore.replace(/^0+/,"");
                if( dotBefore.length == 0 ) dotBefore = "0";
                break;
        }
        
        switch(dotAfter.length){
            case 0:
                dotAfter = "00";
                break;
            case 1:
                dotAfter += "0";
                break;
            default:
                // 截取保留2位小数
                dotAfter = dotAfter.substr(0,2);
                break;
        }
        
        var result = ltZero + dotBefore + '.' + dotAfter;
        console.log(yuanAmt+'->'+result);
        // 校正负零
        if( result == '-0.00' ) result = '0.00'
        console.log('last0->'+result);
        return result;
    }
        
    // come here amount will Integer like -0010 909
    // 处理全部是整数情况
    var ret = yuanAmt;
    if( yuanAmt.length > 1 ){
        // 去除多余的前导0
        ret = yuanAmt.replace(/^0+/,"");    
        if( ret.length == 0 ) ret = "0";
        console.log(yuanAmt + '->' + ret);
    }    
    ret = ltZero + ret + '.00';
    if( ret == '-0.00' ) {
        // 校正负零
        ret = '0.00'
    }
    
    console.log('last->'+ret);
    return ret;
}
原文地址:https://www.cnblogs.com/zhangmo/p/15698592.html