zoukankan      html  css  js  c++  java
  • 前端金钱分转元,元转分精度问题解决

    因为计算机的计算是现将十进制转化为二进制,所以有时候分转元,元转分如果直接*0.01的计算可能会出现类似0.57=56.99999999....的情况

    分转化为元 - 正则解决精度

    export const regFenToYuan = (fen) =>{
        var num = fen;
        num=fen*0.01;
        num+='';
        var reg = num.indexOf('.') >-1 ? /(d{1,3})(?=(?:d{3})+.)/g : /(d{1,3})(?=(?:d{3})+$)/g;
        num=num.replace(reg,'$1');
        num = toDecimal2(num)
        return num
    };

    元转分 - 解决精度问题 yuan:要转换的钱,单位元; digit:转换倍数

    export const regYuanToFen = (yuan:number,digit:number) =>{
        var m=0,
            s1=yuan.toString(),
            s2=digit.toString();
        try{m+=s1.split(".")[1].length}catch(e){}
        try{m+=s2.split(".")[1].length}catch(e){}
        return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m)
    }

    判断是否最多两位小数,正负均可

    export const checkTwoPointNum = (inputNumber) => {
        var partten = /^-?d+.?d{0,2}$/;
        return partten.test(inputNumber)
    };

    强制保留2位小数,如:2,会在2后面补上00.即2.00

    export const toDecimal2 = (x) => {
      var f = parseFloat(x);
      if (isNaN(f)) {
        return false;
      }
      var f = Math.round(x * 100) / 100;
      var s = f.toString();
      var rs = s.indexOf('.');
      if (rs < 0) {
        rs = s.length;
        s += '.';
      }
      while (s.length <= rs + 2) {
        s += '0';
      }
      return s;
    }

    金额转为大写汉子

    export const priceUppercase= (money) => {
        var cnNums = new Array("零","壹","贰","叁","肆","伍","陆","柒","捌","玖"); //汉字的数字
        var cnIntRadice = new Array("","拾","佰","仟"); //基本单位
        var cnIntUnits = new Array("","万","亿","兆"); //对应整数部分扩展单位
        var cnDecUnits = new Array("角","分","毫","厘"); //对应小数部分单位
        //var cnInteger = "整"; //整数金额时后面跟的字符
        var cnIntLast = "元"; //整型完以后的单位
        var maxNum = 999999999999999.9999; //最大处理的数字
    
        var IntegerNum; //金额整数部分
        var DecimalNum; //金额小数部分
        var ChineseStr=""; //输出的中文金额字符串
        var parts; //分离金额后用的数组,预定义
        if( money == "" ){
            return "";
        }
        money = parseFloat(money);
        if( money >= maxNum ){
            // $.alert('超出最大处理数字');
            return "";
        }
        if( money == 0 ){
            //ChineseStr = cnNums[0]+cnIntLast+cnInteger;
            ChineseStr = cnNums[0]+cnIntLast
            //document.getElementById("show").value=ChineseStr;
            return ChineseStr;
        }
        money = money.toString(); //转换为字符串
        if( money.indexOf(".") == -1 ){
            IntegerNum = money;
            DecimalNum = '';
            cnIntLast = '元整'
        }else{
            parts = money.split(".");
            IntegerNum = parts[0];
            DecimalNum = parts[1].substr(0,4);
        }
        let zeroCount = 0;
        let IntLen = 0;
        let n;
        let p;
        let m;
        let q;
        let decLen = 0;
        if( parseInt(IntegerNum,10) > 0 ){//获取整型部分转换
            zeroCount = 0;
            IntLen = IntegerNum.length;
            for( var i=0;i<IntLen;i++ ){
                n = IntegerNum.substr(i,1);
                p = IntLen - i - 1;
                q = p / 4;
                m = p % 4;
                if( n == "0" ){
                    zeroCount++;
                }else{
                    if( zeroCount > 0 ){
                        ChineseStr += cnNums[0];
                    }
                    zeroCount = 0; //归零
                    ChineseStr += cnNums[parseInt(n)]+cnIntRadice[m];
                }
                if( m==0 && zeroCount<4 ){
                    ChineseStr += cnIntUnits[q];
                }
            }
            ChineseStr += cnIntLast;
            //整型部分处理完毕
        }
        if( DecimalNum!= '' ){//小数部分
            decLen = DecimalNum.length;
            for( i=0; i<decLen; i++ ){
                n = DecimalNum.substr(i,1);
                if( n != '0' ){
                    ChineseStr += cnNums[Number(n)]+cnDecUnits[i];
                }
            }
        }
        if( ChineseStr == '' ){
            //ChineseStr += cnNums[0]+cnIntLast+cnInteger;
            ChineseStr += cnNums[0]+cnIntLast;
        }/* else if( DecimalNum == '' ){
                  ChineseStr += cnInteger;
                  ChineseStr += cnInteger;
              } */
        return ChineseStr;
    };

    格式化金钱,三位加一个逗号

    export const priceToThousands = (num: any) =>{
        if(num)
        {
            num = toDecimal2(num)
            //将num中的$,去掉,将num变成一个纯粹的数据格式字符串
            num = num.toString().replace(/$|\,/g,'');
            //如果num不是数字,则将num置0,并返回
            if(''==num || isNaN(num)){return 'Not a Number ! ';}
            //如果num是负数,则获取她的符号
            var sign = num.indexOf("-")> 0 ? '-' : '';
            //如果存在小数点,则获取数字的小数部分
            var cents = num.indexOf(".")> 0 ? num.substr(num.indexOf(".")) : '';
            cents = cents.length>1 ? cents : '' ;//注意:这里如果是使用change方法不断的调用,小数是输入不了的
            //获取数字的整数数部分
            num = num.indexOf(".")>0 ? num.substring(0,(num.indexOf("."))) : num ;
            //如果没有小数点,整数部分不能以0开头
            if('' == cents){ if(num.length>1 && '0' == num.substr(0,1)){return 'Not a Number ! ';}}
            //如果有小数点,且整数的部分的长度大于1,则整数部分不能以0开头
            else{if(num.length>1 && '0' == num.substr(0,1)){return 'Not a Number ! ';}}
            //针对整数部分进行格式化处理,这是此方法的核心,也是稍难理解的一个地方,逆向的来思考或者采用简单的事例来实现就容易多了
            /*
              也可以这样想象,现在有一串数字字符串在你面前,如果让你给他家千分位的逗号的话,你是怎么来思考和操作的?
              字符串长度为0/1/2/3时都不用添加
              字符串长度大于3的时候,从右往左数,有三位字符就加一个逗号,然后继续往前数,直到不到往前数少于三位字符为止
             */
            for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
            {
                num = num.substring(0,num.length-(4*i+3))+','+num.substring(num.length-(4*i+3));
            }
            //将数据(符号、整数部分、小数部分)整体组合返回
            return (sign + num + cents);
        }
    }
  • 相关阅读:
    《Microsoft Sql server 2008 Internals》读书笔记第十一章DBCC Internals(2)
    《Microsoft Sql server 2008 Internals》读书笔记第十一章DBCC Internals(9)
    《Microsoft Sql server 2008 Internals》读书笔记第九章Plan Caching and Recompilation(10)
    CKEditor在asp.net环境下的使用一例
    《Microsoft Sql server 2008 Internals》读书笔记第五章Table(7)
    《Microsoft Sql server 2008 Internals》读书笔记第九章Plan Caching and Recompilation(11)
    千万数据的连续ID表,快速读取其中指定的某1000条数据?
    javascript中的float运算精度
    .Net与Java的互操作(.NET StockTrader微软官方示例应用程序)
    《Microsoft Sql server 2008 Internals》读书笔记第十一章DBCC Internals(6)
  • 原文地址:https://www.cnblogs.com/hurenjie/p/12557145.html
Copyright © 2011-2022 走看看