美文网首页
JS数字转换金额格式方法(千分符,中文大写)

JS数字转换金额格式方法(千分符,中文大写)

作者: 喜剧之王爱创作 | 来源:发表于2019-10-25 20:09 被阅读0次
    4-150H40UGT60.jpg
    在前端开发中,尤其是金融类项目中,经常会遇到数字格式转换金额格式的问题,比如我们会把1000000,转化成,10,000,000这样的千分符表示法,通常又会再加上中文大写“壹仟萬元整”这样的中文大写的金额格式,下面小编总结了两个开箱即用的格式转换函数,供有需要的同学使用
    数字格式转换千分符格式

    1.方法一

            //* 金额千分位加逗号,保留2位小数,不足补零,否则四舍五入
            // * 参数说明:
            // * num:要格式化的数字 string或者number
            // * decimals:保留几位小数
            // * thousandsSep:千分位符号
            // return 金额格式的字符串,如'1,234,567.45'
            // * */
         function number (num, decimals, thousandsSep) {
                if (isNaN(num)) {
                    num = '0.00'
                }
                let prec = !isFinite(+decimals) ? 0 : Math.abs(decimals) // 保留的位数一定是有限位数的正整数
                let sep = (typeof thousandsSep === 'undefined') ? ',' : thousandsSep
                let s = num.toString().replace(/,/g, '') // 字符串,将,变成'';
                let p = parseFloat(s) // 解析一个字符串,并返回一个浮点数
                let n = isNaN(p) ? 1 : p
                let formatNum = n.toFixed(prec).toString().replace(/(\d)(?=(\d{3})+\.)/g, function ($0, $1) {
                    return $1 + sep
                })
                return num ? formatNum : ''
            }
    

    2.方法二,保留位小数点后四舍五入

    function number_format(number, decimals, dec_point, thousands_sep) {
      /*
      * 参数说明:
      * number:要格式化的数字
      * decimals:保留几位小数
      * dec_point:小数点符号
      * thousands_sep:千分位符号
      * */
      number = (number + '').replace(/[^0-9+-Ee.]/g, '');
      var n = !isFinite(+number) ? 0 : +number,
        prec = !isFinite(+decimals) ? 0 : Math.abs(decimals),
        sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep,
        dec = (typeof dec_point === 'undefined') ? '.' : dec_point,
        s = '',
        toFixedFix = function (n, prec) {
          var k = Math.pow(10, prec);
          return '' + Math.ceil(n * k) / k;
        };
      s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.');
      var re = /(-?\d+)(\d{3})/;
      while (re.test(s[0])) {
        s[0] = s[0].replace(re, "$1" + sep + "$2");
      }
      if ((s[1] || '').length < prec) {
        s[1] = s[1] || '';
        s[1] += new Array(prec - s[1].length + 1).join('0');
      }
      return s.join(dec);
    }
    
    var num=number_format(1234567.089, 2, ".", ",");//1,234,567.09
    console.log(num);
    

    3.方法三,保留位小数后直接舍去

    function number_format(number, decimals, dec_point, thousands_sep) {
        /*
        * 参数说明:
        * number:要格式化的数字
        * decimals:保留几位小数
        * dec_point:小数点符号
        * thousands_sep:千分位符号
        * */
        number = (number + '').replace(/[^0-9+-Ee.]/g, '');
        var n = !isFinite(+number) ? 0 : +number,
          prec = !isFinite(+decimals) ? 0 : Math.abs(decimals),
          sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep,
          dec = (typeof dec_point === 'undefined') ? '.' : dec_point,
          s = '',
          toFixedFix = function (n, prec) {
            var k = Math.pow(10, prec);
            return '' + Math.floor(n * k) / k;
          };
        s = (prec ? toFixedFix(n, prec) : '' + Math.floor(n)).split('.');
        var re = /(-?\d+)(\d{3})/;
        console.log(s)
        while (re.test(s[0])) {
          s[0] = s[0].replace(re, "$1" + sep + "$2");
        }
        if ((s[1] || '').length < prec) {
          s[1] = s[1] || '';
          s[1] += new Array(prec - s[1].length + 1).join('0');
        }
        return s.join(dec);
    }
    var num=number_format(1234567.089, 2, ".", ",");//1,234,567.08
    console.log(num)
    

    上面的各种方法直接传入对应参数,就可以输出你期望的千分符格式的数字了。

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

    直接参入数字参数调用上面的方法,就可以输出‘壹萬元整’这样类型的中文大写金额格式了。
    注意:上面几个方法钟要转换的数字,必须是Number类型的

    相关文章

      网友评论

          本文标题:JS数字转换金额格式方法(千分符,中文大写)

          本文链接:https://www.haomeiwen.com/subject/uvsevctx.html