用js将数字转中文

1,611 阅读1分钟

题目

  • 实现一个 numberTranToCN 函数
  • 比如 numberTranToCN(12345),输出 一万两千三百四十五;
  • 比如 numberTranToCN(1000003),输出 一百万零三;
        /*
            解题思路:将数字每四个拆分一次,每次后面加万,亿,万亿,亿亿作为节权位
            然后单独将每四个数按情况转化为汉字,其他情况按下标即可转化,主要考虑为0的情况,
            当零为后面出现时,直接去除,当在两个大于零的数字中间出现时,将多个零合并为一个零
        */
        let numChar=['零','一','二','三','四','五','六','七','八','九']
        let numUnit=['','十','百','千']         //权位
        let numSection=['','万','亿','万亿','亿亿']     //节权位
        formatSection=(num)=>{    
            let arr=(num+'').split('').reverse();
            let str=''
            for(let i=0;i<arr.length;i++){          //将0-9转化为零到九
                let char=arr[i]==0?numChar[0]:numChar[arr[i]]+numUnit[i]   //当数字为0时不加权位,非零加权位 
                str=char+str;
            }
            let s=str.replace(/零+/g,'零').replace(/零+$/,'')       //将多个零合并为一个零,并剔除尾端的零
            return s;
        }
        formatNum=(num,str)=>{      //将字符串按个数拆分
            let len=Math.ceil(str.length/num);
            let arr=[]
            for(let i=0;i<len;i++){
                let reverseStr=str.split('').reverse().join('')
                let s=reverseStr.slice(i*num,i*num+num).split('').reverse().join('')
                arr.unshift(s)
            }
            return arr
        }
        numberTranToCN=(num)=>{
            let arr=formatNum(4,num+'')         //将数字每四个拆分一次
            let list=[]
            for(let i=0;i<arr.length;i++){
                let str=formatSection(arr[i])
                list.push(str)
                
            }
            let reverseList=list.reverse();
            for(let j=0;j<reverseList.length;j++){
                reverseList[j]+=numSection[j]
            }
            return reverseList.reverse().join('')
        }
        let str=numberTranToCN(12004004002)
        console.log(str)