将金额数字转换成汉字

需求:输入数字,将数字转换成汉字

注意:只支持到十亿,小数点只支持两位数

思路

  1. 将数字转换成汉字
  2. 根据其数位添加其计数单位
  3. 判断0在不同位置的读法
    • 个位:不转汉字,加计数单位
    • 十位:转汉字,不加计数单位
    • 百位:转汉字,不加计数单位
    • 千位:转汉字,不加计数单位
    • 万位:不转汉字,加计数单位
    • 十万位:转汉字,不加计数单位
    • 百万位:转汉字,不加计数单位
    • 千万位:转汉字,不加计数单位
    • 亿位:不转汉字,加计数单位
    • 十亿位:转汉字,不加计数单位
  4. 去掉多余的汉字
    1. 去掉重复的零
    2. 去掉后面是计数单位的零
    3. 去掉结尾的零
    4. 判断重复的计数单位(只有零在万位时会出现此情况)

方法中变量

  • @unitList: 计数单位
  • @textList:数字对应的汉字
  • @numArray: 数字的小数和整数分开成数组
  • @integerArray: 整数部分
  • @numText: 转换结果
  • @numTextArr: 汉字格式的数组

代码

function transitText(number) {
        if (number === 0) {
            return "零元";
        }

        //定义数据
        let unitList = ['', '拾', '佰', '仟', '万', '拾', '佰', '仟', '亿', '拾'];
        let textList = { 0: "零", 1: "壹", 2: "贰", 3: "叁", 4: "肆", 5: "伍", 6: "陆", 7: "柒", 8: "捌", 9: "玖", };
        let numArray = (number + "").split(".");
        let integerArray = numArray[0].split("");
        let numText = "";

        //遍历进行汉字转换和添加计数单位
        integerArray.forEach((item, i) => {
            let indexLength = integerArray.length - 1 - i; //当前数字的数位

            if (item == 0) { //判断为0的情况
                numText += [0,4,8].includes(indexLength) ? unitList[indexLength] : textList[item];
            } else {
                numText += textList[item] + unitList[indexLength];
            }
        });

        /*去掉多余的汉字*/
        var numTextArr = numText.split("");
        for (let i = 0; i < numTextArr.length; i++) {
            //去掉重复的零和后面是计数单位的零
            if (numTextArr[i] == "零" && (numTextArr[i + 1] == "零" || unitList.indexOf(numTextArr[i + 1]) != -1)) {
                numTextArr.splice(i, 1);
                i--;
            }
            //判断计数单位是否重复
            if (unitList.indexOf(numTextArr[i]) == 4 && unitList.indexOf(numTextArr[i - 1]) >= 8) {
                numTextArr.splice(i, 1);
                i--;
            }
        }
        numText = numTextArr.join("");

        //去掉末尾的零
        if (numText[numText.length - 1] == "零") {
            numText = numText.slice(0, numText.length - 1);
        }

        //判断是否需要有小数位
        if (numArray.length == 1) {
            return numText + "元整";
        } else {
            let decimal = numArray[1].split(""); //小数部分
            if (decimal[0] == 0 && decimal[1] == 0) {
                return numText + "元整";
            } else {
                numText += "元";
                for (let i = 0; i < decimal.length; i++) {
                    if (i == 1 && decimal[i] == 0) {
                        break;
                    }
                    numText += textList[decimal[i]];
                    numText += i == 0 ? "角" : "分";
                }
                return numText;
            }
        }
    }

 方法内容上没有进行优化,可以考虑能否进一步优化,支持金额长度上可以自己延长

posted @ 2022-04-15 16:02  前端泥石流  阅读(449)  评论(0)    收藏  举报