
数字转中文大写
覆盖范围:
- 最大值999999999999.999;
- 正整数,如1234;
- 负整数,如-123;
- 小数(保留三位),如123.456。
处理“零”:
- 不能出现连续的零;
- 数字末尾不可出现零;
- 位数前不可出现零,如1300000 => 一百三十零万元整;
直接上代码:
function NumberToUppercase(number) {
if (typeof number !== "number") {
console.warn(`${number} is not a Number Type`);
return number;
}
if (number > 999999999999.999) {
console.warn(`${number} is out of numeric range`);
return number;
}
number = number.toString();
const upper = ["零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"];
const small = ["角", "分", "厘"];
const digit = ["", "拾", "佰", "仟"];
const level = ["元", "万", "亿"];
const isMinus = number.includes("-");
if (isMinus) number = number.replace("-", "");
const hasDecimal = number.includes(".");
let integerPart, decimalPart;
if (hasDecimal) {
let [n, d] = Number(number).toFixed(3).split(".");
integerPart = n.split("").map(Number);
decimalPart = d.split("").map(Number);
} else {
integerPart = number.split("").map(Number);
}
const integer = integerPart.reduce((res, n, i) => {
const index = integerPart.length - i - 1;
const idx = Math.floor(index / 4);
const current = res[idx] ? res[idx] : (res[idx] = []);
current.push(upper[n] + (n > 0 ? digit[index % digit.length] : ""));
return res;
}, []);
const integerValue = integer.reverse().reduce((pre, val, i) => {
const index = integer.length - i - 1;
let cur = val.join("").replace(/零+/g, "零");
if (pre[pre.length - 1] === "零" && cur.indexOf("零") === 0) {
cur = cur.substring(1, cur.length - 1);
}
if (cur.lastIndexOf("零") === cur.length - 1) {
cur = cur.substring(-1, cur.length - 1);
}
return pre + cur + level[index];
}, "");
let decimal;
if (decimalPart) {
decimal = decimalPart.reduce((res, n, i) => {
const value = upper[n];
let current = value + (n > 0 ? small[i] : "");
if (i === decimalPart.length - 1 && value === "零") {
current = "";
}
return res + current;
}, "");
decimal = decimal.replace(/零+/g, "零");
}
const result = !hasDecimal
? `${integerValue}整`
: `${integerValue}${decimal}`;
return (isMinus ? "负" : "") + result;
}
看效果:
