数字转中文

  1. 数字中文映射表
  2. 处理特殊情况,什么时候该读零,什么时候不应该出现零?
  3. 单位的拼接
  4. 实现的难点就在于处理零的情况

实现

/**
* 给定一个数字,将其转换为中文表示。例如,将数字123转换为“一百二十三”。
* @author: Huang
* @param {number} num 要转换的数字
* @return {string} 转换后的中文表示
*/
const numberToChinese = (num) => {
if (typeof num !== "number") {
throw new Error("function only accept number type");
}
// 每次提取四位数进行转换
const nums = num
.toString()
.replace(/(?=(\d{4})+$)/g, ",")
.split(",")
.filter(Boolean);

const chineseMap = ["", "万", "亿"];
let res = "";
for (let i = 0; i < nums.length; i++) {
//得到转换结果
const chinese = conversion(nums[i]);
//得到单位
const unit = chineseMap[nums.length - i - 1];
//处理中间连续四位为零的特殊情况
if (chinese === "") {
res += "零";
continue;
}
res += chinese + unit;
}
res = handlerZero(res);
return res;
};
/**
* 每次转换四位数,将结果拼接起来
* @param {number} n 四位数组成的数字
* @return {string} 转换后的中文表示
*/

const conversion = (n) => {
// 数值映射表
const chineseMap = [
"零",
"一",
"二",
"三",
"四",
"五",
"六",
"七",
"八",
"九",
];
// 定义中文单位 空串是为了对齐
const unit = ["", "十", "百", "千"];
let res = "";
for (let i = 0; i < n.length; i++) {
const digit = chineseMap[n[i]];
//获取到单位
let u = unit[n.length - i - 1];
//处理中间为零的特殊情况 避免出现 一千零零一的情况 ->一千零一
if (digit === "零") {
u = "";
}
res += digit + u;
}
res = handlerZero(res);
return res;
};
/**
* 处理连续零的特殊情况与最低位为零的特殊情况
* @param {string} str
* @returns
*/
const handlerZero = (str) => str.replace(/零+/g, "零").replace(/零$/, "");

console.log(numberToChinese(1200008998));