数字金额转中文大写(16位整数+4位小数)

金额转中文大写

急用的小伙伴直接下拉到底取函数

准备阶段

1,要转中文首先定义出中文大写数字

	const cnNums: string[] = ["零","壹","贰","叁","肆","伍","陆","柒","捌","玖"];

2,定义中文计数单位和拓展单位

    //基本单位
    const cnIntRadice: string[] = ["", "拾", "佰", "仟"];
    //对应整数部分扩展单位
    const cnIntUnits: string[] = ["", "万", "亿", "兆"];
    //对应小数部分单位
    const cnDecUnits: string[] = ["角", "分", "毫", "厘"];
    //整数以后的单位
    const cnIntLast: string = "元";
    //无小数时后缀字符
    const cnInteger: string = "整";

3,定义一些其他项

    //最大处理的数字
    const maxNum: number = 9999999999999999.9999;
    //金额整数部分
    let integerNum: string = "";
    //金额小数部分
    let decimalNum: string = "";
    //最后输出的中文金额字符串
    let chineseMoney: string = "";

分析阶段

money:函数接收的参数

1,当传了空字符串进来时,直接返回空字符串

    // 传入的参数为空情况
    if (money == "") {
    
    
      return "";
    }

2,将字符串转为浮点数,然后进行一些比较

    const numberMoney = parseFloat(money);
    if (numberMoney == 0) {
    
    
      // 转换后为0的情况
      chineseMoney = cnNums[0] + cnIntLast + cnInteger;
      return chineseMoney;  //'零元整'
    }else if (numberMoney >= maxNum) {
    
    
      //转换后超出范围的情况
      return "超出最大范围";
    }

3,分析是否有小数点,没有小数点就将money直接赋给整数部分,如果有小数点,进行一些额外的判断,然后分别把小数点前后的赋给整数部分和小数部分。

    if (money.indexOf(".") == -1) {
    
    
      //没有小数点
      integerNum = money;
    } else {
    
    
      //有小数点
      let parts = money.split(".");
      console.log(parts);
      if (parts.length > 2) {
    
    
        console.log("错误");
        return "格式错误";
      } else if (parts[1].length > 4) {
    
    
        return "小数点后最多四位";
      }
      integerNum = parts[0];
      decimalNum = parts[1];
    }

4,上面已经判断了是否将输入的值转换为整数或者拆分为整数和小数两部分转换整数部分,下面就处理一下整数部分。

首先对应位数的数字转大写就可以了,因为 cnNums 是零开头的和,取 cnNums [当前位数数字],就可以将小写数字转成中文数字,然后考虑单位,4位以内分别是:无,拾,佰,仟,5到8位分别是:万,拾万,佰万,仟万,9到12位是:亿,拾亿,佰亿,仟亿。。。。以此类推:四个是一轮回,轮回顺序是:[“”, “拾”, “佰”, “仟”],然后大计数单位是:[“”, “万”, “亿”, “兆”],这样我们就可以将一个最大4×4=16位的数字转中文,最大单位仟兆。

遍历整数部分,判断当前位数是偶能被4整除,如果能被4整除说明需要加上大计数单位。

然后判断当前位是否为0,如果是零需要在判断后面是否跟了别的项,如果跟了大于零的项,需要加上汉字零,如果没有跟大于零的项则不需要处理。

    //转换整数部分
    if (parseInt(integerNum, 10) > 0) {
    
    
      let zeroCount = 0; //连续出现的零的个数
      let IntLen = integerNum.length;
      let integerArr: string[] = integerNum.split("");
      integerArr.forEach((item: string, index: number) => {
    
    
        let residue = IntLen - index - 1; //当前剩余需要转换的位数
        let m = residue % 4; //m判断当前位数在四位轮回的第几位
        if (item == "0") {
    
    
          zeroCount++;
        } else {
    
    
          if (zeroCount > 0) {
    
    
            chineseMoney += cnNums[0];
          }
          zeroCount = 0;
          chineseMoney += cnNums[parseInt(item)] + cnIntRadice[m];
        }
        if (m == 0 && zeroCount < 4) {
    
    
          //m为0时表示在4的倍数位,需多加上大单位
          let bigUnit = residue / 4;
          chineseMoney += cnIntUnits[bigUnit];
        }
      });
      // 最后加上元
      chineseMoney += cnIntLast;
    }

如果有小数部门,处理一下小数部门,逻辑比上面简单得多,只要不为0,直接拼上对应单位就行了。

没有小数部分的情况下,加上后缀"整"。

    // 转换小数部分
    if (decimalNum != "") {
    
    
      let decimalArr: string[] = decimalNum.split("");
      decimalArr.forEach((item: string, index: number) => {
    
    
        if (item != "0") {
    
    
          chineseMoney += cnNums[Number(item)] + cnDecUnits[index];
        }
      });
    } else {
    
    
      chineseMoney += cnInteger;
    }

到这里就处理完了,将chineseMoney返回即可的带最后结果。

完整代码如下:

  const getChieseMoney = (money: string) => {
    
    
    //汉字的数字
	const cnNums: string[] = ["零","壹","贰","叁","肆","伍","陆","柒","捌","玖"];
    //基本单位
    const cnIntRadice: string[] = ["", "拾", "佰", "仟"];
    //对应整数部分扩展单位
    const cnIntUnits: string[] = ["", "万", "亿", "兆"];
    //对应小数部分单位
    const cnDecUnits: string[] = ["角", "分", "毫", "厘"];
    //整数以后的单位
    const cnIntLast = "元";
    //无小数时后缀字符
    const cnInteger = "整";
    //最大处理的数字
    const maxNum: number = 9999999999999999.9999;
    //金额整数部分
    let integerNum: string = "";
    //金额小数部分
    let decimalNum: string = "";
    //最后输出的中文金额字符串
    let chineseMoney: string = "";
    // 传入的参数为空情况
    if (money == "") {
    
    
      return "";
    }
    const numberMoney = parseFloat(money);
    if (numberMoney >= maxNum) {
    
    
      return "超出最大范围";
    }

    // 传入的参数为0情况
    if (numberMoney == 0) {
    
    
      chineseMoney = cnNums[0] + cnIntLast + cnInteger;
      return chineseMoney;
    }
    if (money.indexOf(".") == -1) {
    
    
      //没有小数点
      integerNum = money;
    } else {
    
    
      //有小数点
      let parts = money.split(".");
      if (parts.length > 2) {
    
    
        console.log("错误");
        return "格式错误";
      } else if (parts[1].length > 4) {
    
    
        return "小数点后最多四位";
      }
      integerNum = parts[0];
      decimalNum = parts[1];
    }
    //转换整数部分
    if (parseInt(integerNum, 10) > 0) {
    
    
      let zeroCount = 0; //连续出现的零的个数
      let IntLen = integerNum.length;
      let integerArr: string[] = integerNum.split("");
      integerArr.forEach((item: string, index: number) => {
    
    
        let residue = IntLen - index - 1; //当前剩余需要转换的位数
        let m = residue % 4; //m判断当前位数在四位轮回的第几位
        if (item == "0") {
    
    
          zeroCount++;
        } else {
    
    
          if (zeroCount > 0) {
    
    
            chineseMoney += cnNums[0];
          }
          zeroCount = 0;
          chineseMoney += cnNums[parseInt(item)] + cnIntRadice[m];
        }
        if (m == 0 && zeroCount < 4) {
    
    
          //m为0时表示在4的倍数位,需多加上大单位
          let bigUnit = residue / 4;
          chineseMoney += cnIntUnits[bigUnit];
        }
      });
      chineseMoney += cnIntLast; // 最后加上元
    }
    // 转换小数部分
    if (decimalNum != "") {
    
    
      let decimalArr: string[] = decimalNum.split("");
      decimalArr.forEach((item: string) => {
    
    
        if (item != "0") {
    
    
          chineseMoney += cnNums[Number(item)] + cnDecUnits[index];
        }
      });
    } else {
    
    
      chineseMoney += cnInteger;
    }
    return chineseMoney;
  };

最后来一波极限操作试试

输入:1234567890003224.1234

输入:壹仟贰佰叁拾肆兆伍仟陆佰柒拾捌亿玖仟万零叁仟贰佰贰拾肆元壹角贰分叁毫肆厘

芜湖~

猜你喜欢

转载自blog.csdn.net/SJJ980724/article/details/126179842
今日推荐