js数字金额转大写

1,516 阅读1分钟

1.思路

1.拆分位亿,万,仟佰拾,小数部分。亿和万调用处理仟佰拾的方法。

2.整数部分倒叙处理,小数部分正叙处理。

2.js代码实现

详细请看代码注释解释

const getMoney = (money) => {
  if (!money) return;
  let moneyArr = parseFloat(money).toFixed(2).split("."); // 转成字符串;分割整数和小数
  money = moneyArr[0]
    ?.replace(/\b(0+)/g, "")
    .split("")
    .reverse(); //整数部分: 去掉头部的0, 000130130 => 130130;传成数组;倒置
  digit = moneyArr[1]?.replace(/(0+)\b/g, "").split(""); //小数部分: 去掉后面的0, 20 => 2;传成数组;

  let resMoney = 0;

  const dic = {
    0: "零",
    1: "壹",
    2: "贰",
    3: "叁",
    4: "肆",
    5: "伍",
    6: "陆",
    7: "柒",
    8: "捌",
    9: "玖",
  };

  const dicUnit = {
    0: "",
    1: "拾",
    2: "佰",
    3: "仟",
  };

  const digitDicUnit = {
    0: "角",
    1: "分",
  };

  // 处理仟、佰、拾; ['1', '0', '0', '1'] => 叁仟零零壹
  const getInfo = (item) => {
    if (!item || item.length > 4) return;

    return item
      .map((subItem, index) => {
        if (subItem === "0") {
          return dic[0];
        }
        return `${dic[subItem]}${dicUnit[index]}`;
      })
      .reverse()
      .join("")
      .replace(/(零+)$/g, ""); //反转回来;拼接成字符串;去掉尾部的 零
  };

  // 处理整数部分
  switch (true) {
    case money.length < 5:
      resMoney = getInfo(money);
      break;
    case money.length < 9:
      resMoney = `${getInfo(money.slice(4, money.length))}${getInfo(
        money.slice(0, 4)
      )}`;
      break;
    case money.length < 13:
      resMoney = `${getInfo(money.slice(8, money.length))}亿${getInfo(
        money.slice(4, 8)
      )}${getInfo(money.slice(0, 4))}`;
      break;
  }

  resMoney = `${resMoney.replace(/零零零/g, "零").replace(/零零/g, "零")}`;

  let digitMoney;
  // 处理小数部分
  if (digit) {
    digitMoney = digit
      .map((digitItem, index) => {
        if (digitItem === "0") {
          return;
        }
        return `${dic[digitItem]}${digitDicUnit[index]}`;
      })
      .join("");
  }

  !!digitMoney
    ? (resMoney = `${resMoney ? `${resMoney}元` : resMoney}${digitMoney}`)
    : (resMoney = `${resMoney}元整`);

  return resMoney;
};