zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    string subscript out of range
    基数树(radix tree)
    改进版的快速排序
    快速排序算法-C语言实现
    归并排序
    用数组名做函数参数(转)
    堆和栈的区别
    给指针malloc分配空间后就等于数组吗?
    codeblocks中添加-std=c99
    堆排序-C语言实现
  • 原文地址:https://www.cnblogs.com/zhangmo/p/15698592.html
Copyright © 2011-2022 走看看