今天看群里有人有人在说开票的数字大写,感觉也是不个难事,反正现在又不忙,自己写了个玩玩。
自己瞎写的,开票最高到万亿,估计这个数额大概率是用不上的吧
唯一可能在意的地方就是计算的减法上,不晓得会不会有计算精度问题。
const UppercaseWord = {
0: "零",
1: "壹",
2: "贰",
3: "叁",
4: "肆",
5: "伍",
6: "陆",
7: "柒",
8: "捌",
9: "玖",
};
function setNormalUnit(num, unit) {
const q = Math.floor(num / 1000);
const b = Math.floor((num - q * 1000) / 100);
const s = Math.floor((num - q * 1000 - b * 100) / 10);
const g = Math.floor(num - q * 1000 - b * 100 - s * 10);
if (q > 0 && b > 0 && s > 0 && g > 0)
return `${UppercaseWord[q]}仟${UppercaseWord[b]}佰${UppercaseWord[s]}拾${UppercaseWord[g]}${unit}`;
if (q > 0 && b === 0 && s > 0 && g > 0)
return `${UppercaseWord[q]}仟${UppercaseWord[s]}拾${UppercaseWord[g]}${unit}`;
if (q === 0 && b > 0 && s > 0 && g > 0)
return `${UppercaseWord[b]}佰${UppercaseWord[s]}拾${UppercaseWord[g]}${unit}`;
if (q > 0 && b === 0 && s === 0 && g > 0) return `${UppercaseWord[q]}仟${UppercaseWord[g]}${unit}`;
if (q === 0 && b > 0 && s === 0 && g > 0) return `${UppercaseWord[b]}佰${UppercaseWord[g]}${unit}`;
if (q === 0 && b === 0 && s > 0 && g > 0) return `${UppercaseWord[s]}拾${UppercaseWord[g]}${unit}`;
if (q === 0 && b === 0 && s === 0 && g > 0) return `${UppercaseWord[g]}${unit}`;
if (q === 0 && b === 0 && s === 0 && g === 0) return "";
}
function setBigUnit(num) {
const n = Math.floor(num / 1000000000000);
return setNormalUnit(n, "万亿");
}
function setBillion(num) {
const n = Math.floor((num % 1000000000000) / 100000000);
return setNormalUnit(n, "亿");
}
function setMillion(num) {
const n = Math.floor((num % 100000000) / 10000);
return setNormalUnit(n, "万");
}
function setNromalNum(num) {
const n = Math.floor(num % 10000);
return setNormalUnit(n, "元");
}
function setFloatNum(num) {
const n = `${num}`.match(/(?<=\.)\d{2}/g).join("");
const f = n[0];
const s = n[1];
return `${UppercaseWord[f]}角${UppercaseWord[s]}分`;
}
function isMinusNum(num) {
const n = /^[\-]/g.test(num);
if (n) return "负";
return "";
}
function main(num) {
const isFolat = /\./.test(num);
const n = num.replace(/^[\-]/g, "");
const f = parseInt(n);
if (isFolat) {
return `${isMinusNum(num)}${setBigUnit(f)}${setBillion(f)}${setMillion(f)}${setNromalNum(f)}${setFloatNum(num)}`;
} else {
return `${isMinusNum(num)}${setBigUnit(f)}${setBillion(f)}${setMillion(f)}${setNromalNum(f)}整`;
}
}
(function () {
console.log(main(`-1234567891234567.123456789`)); // 负壹仟贰佰叁拾肆万亿伍仟陆佰柒拾捌亿玖仟壹佰贰拾叁万肆仟伍佰陆拾柒元壹角贰分
console.log(main(`1234567891234567`)); // 壹仟贰佰叁拾肆万亿伍仟陆佰柒拾捌亿玖仟壹佰贰拾叁万肆仟伍佰陆拾柒元整
})();