• Javascript将数字转为中文(1234转为一千二百三十四)


    在文章的开头,推荐一下我最近刚发布的npm小工具:里面包含了将数字转为汉字的方法, 添加了对金额的支持,并添加了对边界条件的控制。

    https://www.npmjs.com/package/lidashi-tools

    安装方法:npm   install   lidashi-tools

    使用方法:import  util  from  'lidashi-tools'

    util.transformNumber2CN(90071992547444, false, true)

    输出:玖拾万亿零柒佰壹拾玖亿玖仟贰佰伍拾肆万柒仟肆佰肆拾肆元整

    //js实现将数字1234转化为汉字字符串(一千二百三十四)(或大写汉字壹仟贰佰叁拾肆);

    /*阿拉伯数字转中文数字 中文数字的特点: 每个计数数字都跟着一个权位,权位有:十、百、千、万、亿。 以“万”为小节,对应一个节权位,万以下没有节权位。 每个小节内部以“十百千”为权位独立计数。 “十百千”不能连续出现,而“万”和“亿”作为节权位时可以和其他权位连用,如:“二十亿”。 中文数字对“零”的使用要满足以下三条规则: 以10000为小节,小节的结尾即使是0,也不使用零。 小节内两个非0数字之间要使用“零”。 当小节的“千”位是0时(即:1~999),只要不是首小节,都要补“零”。 算法设计的一些说明: 对“零”的第三个规则,把检测放在循环的最前面并默认为false,可以自然的丢弃最高小节的加零判断。 单个数字转换用数组实现,var chnNumChar = ["零","一","二","三","四","五","六","七","八","九"]; 节权位同样用数组实现,var chnUnitSection = ["","万","亿","万亿","亿亿"]; 节内权位同样用数组实现,var chnUnitChar = ["","十","百","千"];*/

     注意: 下面的方法只针对1亿亿以下数字有效,因为在日常项目中,一亿亿已经是非常大的数字,基本上达不到这个量

    //如果数字含有小数部分,那么可以将小数部分单独取出
    //将小数部分的数字转换为字符串的方法:
    
    var chnNumChar = ["零","一","二","三","四","五","六","七","八","九"];
        var chnUnitSection = ["","万","亿","万亿","亿亿"];
        var chnUnitChar = ["","十","百","千"];
    
    var numToChn = function(num){
          var index =  num.toString().indexOf(".");
          if(index != -1){
              var str = num.toString().slice(index);
              var a = "点";
                  for(var i=1;i<str.length;i++){
                         a += chnNumChar[parseInt(str[i])];
                   }
              return a ;
          }else{
              return '';
          }
    }
    
    //定义在每个小节的内部进行转化的方法,其他部分则与小节内部转化方法相同
    function sectionToChinese(section){
        var str = '', chnstr = '',zero= false,count=0;   //zero为是否进行补零, 第一次进行取余由于为个位数,默认不补零
        while(section>0){
             var v = section % 10;  //对数字取余10,得到的数即为个位数
             if(v ==0){                    //如果数字为零,则对字符串进行补零
                 if(zero){
                     zero = false;        //如果遇到连续多次取余都是0,那么只需补一个零即可
                     chnstr = chnNumChar[v] + chnstr; 
                 }      
             }else{
                 zero = true;           //第一次取余之后,如果再次取余为零,则需要补零
                 str = chnNumChar[v];
                 str += chnUnitChar[count];
                 chnstr = str + chnstr;
             }
             count++;
             section = Math.floor(section/10);
        }
        return chnstr;
    }
    
    
    
    //定义整个数字全部转换的方法,需要依次对数字进行10000为单位的取余,然后分成小节,按小节计算,当每个小节的数不足1000时,则需要进行补零
    
    function TransformToChinese(num){
             var a = numToChn(num);
             num = Math.floor(num);
              var unitPos = 0;
              var strIns = '', chnStr = '';
              var needZero = false;
             
              if(num === 0){
                    return chnNumChar[0];
              } 
              while(num > 0){
                    var section = num % 10000;
                    if(needZero){
                      chnStr = chnNumChar[0] + chnStr;
                    }
                    strIns = sectionToChinese(section);
                    strIns += (section !== 0) ? chnUnitSection[unitPos] : chnUnitSection[0];
                    chnStr = strIns + chnStr;
                    needZero = (section < 1000) && (section > 0);
                    num = Math.floor(num / 10000);
                    unitPos++;
              }
             
             return chnStr+a;
    }
    
    
    
    TransformToChinese(12339492835.99302);
    //输出    "一百二十三亿三千九百四十九万二千八百三十五点九九三零二"
  • 相关阅读:
    LintCode A+B问题
    LintCode 斐波纳契数列
    LintCode 删除链表中的元素
    LintCode 整数排序
    c++ lower_bound upper_bound
    259. 3Sum Smaller
    86. Partition List
    209. Minimum Size Subarray Sum
    11. Container With Most Water
    360. Sort Transformed Array
  • 原文地址:https://www.cnblogs.com/liquanjiang/p/8655075.html
Copyright © 2020-2023  润新知