题目描述

写个函数trans,将数字转换成汉语的输出,输入为不超过10000亿的数字。

例如:trans(123456) —— 十二万三千四百五十六

思路解析

数字替换为中文,主要就是需要考虑单位。 中文单位挺有规律的,每 4 位就是 千/百/十 之间,每 4 位分割,注意需要从后往前按照 4 位分割,分割之后添加对应的单位即可。

原始数据:       1 2 3 4 5 6 7 8 9 9 9 9 8
按 4 位分割:    1,2 3 4 5,6 7 8 9,9 9 9 8
给每4位添加单位: 1,2千3百4十5,6千7百8十9,9千9百9十8
替换分割符位:    1万亿2千3百4十5亿6千7百8十9万9千9百9十8

最后替换数字为中文的即可.

同时有两个点需要特殊处理一下:

  1. 10 ~ 20间的数字,中文是不是三位,例如 13 => 十三
  2. 遇到零的需要特殊处理,多个 0 和 单个 0 对应中文都是一个零

代码实现



// 处理四位数字的展示
// 例如 1234 => 一千二百三十四
function transNumToZh(number) {
  const numChar = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'];
  const numUnit = ['', '十', '百', '千'];

  const res = [];

  const numStr = String(number);
  const len = numStr.length;

  if (len > 4) {
    throw Error('not support');
  }

  for (let i = 0; i < numStr.length; i++) {
    // 处理 0 情况, 如果出现多个 0 只需要添加一个零
    if (numStr[i] !== '0') {
      if (numStr[i - 1] === '0') {
        res.push(numChar[0]);
      }
      res.push(numChar[numStr[i]]);
      res.push(numUnit[len - i - 1]);
    }
  }
  if (len === 2 && numStr[0] === '1') {
    // 移除首位,11 = 一十一 => 十一
    res.shift();
  }
  return res.join('');
}

function trans(number) {
  const numStr = String(number);
  const len = numStr.length;
  let numSection = ['', '万', '亿', '万亿', '亿亿'];
  const res = [];
  for (let i = len; i > 0; i -= 4) {
    const segment = transNumToZh(numStr.slice(Math.max(0, i - 4), i));
    // 加入计算的单位,因为 i 从 len开始计算,(len - i) / 4 表示 for 渲染执行的第几次,
    // 第 0 次是最后 4 位,第 1 次是倒数第 4 位 ~ 第 8 位对应单位为万
    segment && res.unshift(numSection[(len - i) / 4]);
    res.unshift(segment);
  }
  return res.join('');
}
Last Updated:
Contributors: tiodot