Vue JavaScript 小写数字金额转换成大写汉字(附编程思路)
一、编程思路(本案例只考虑9999万亿以内的数字转换,相信这个金额对于人民币来说已经足够庞大了,超过此数值的金额不保证转换汉字的准确性,且最多精确到小数点后四位):
1、将示例(不管是数字还是字符串)统一转换成字符串 A
2、将字符串 A 按照小数点切割成数组 B
3、取数组 B 的整数部分,将每一个数字转换成大写汉字,并加上单位“個、拾、佰、仟”,其中“個”不用显示,用空字符替代,第5位额外加“萬”这个单位,第9位额外加“亿”,由此得到完整的整数部分大写汉字字符串 C
4、取数组 B 的小数部分,将每一个数字转换成大写汉字,并加上单位“角、分、毫、厘”,由此得到完整的小数部分大写汉字字符串 D
5、将字符串 C 拼接上一个“圆”,再拼接上字符串 D 得到完整的全部数字的大写汉字字符串 F
6、将字符串 F 中的零角、零分、零毫、零厘全部替换成空字符串,得到字符串 G
7、将字符串 G 中的零仟、零佰、零拾全部替换成零,得到字符串 H
8、将字符串 H 中的2个及以上连续的零全部替换成单个零,得到字符串 K
9、还有一些转换或替换,详见下方代码示例
10、最终得到我们需要的大写汉字金额
二、编程示例:
export const numToChinessCap = (numStr) => {
console.log("numStr = " + numStr);
const regex = /^\d+(\.\d+)?$/;
if (!regex.test(numStr)) {
// console.log("不是有效的整数或小数");
return "";
}
if (numStr.startsWith(".")) {
// console.log("不是有效的整数或小数");
return "";
}
if (numStr.endsWith(".")) {
// console.log("不是有效的整数或小数");
return "";
}
if (numStr.length > 1 && numStr.startsWith("0") && !numStr.startsWith("0.")) {
// console.log("不是有效的整数或小数");
return "";
}
const nums = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];
const integerUtits = ['', '拾', '佰', '仟'];
let parts = numStr.split('.');
if (parts.length != 1 && parts.length != 2) {
// console.log("不是有效的整数或小数");
return "";
}
let integerPart = parts[0];
let chineseInteger = '';
let chineseIntegerArray = [];
let integerIndex = 0;
for (let i = integerPart.length - 1; i >= 0; i--) {
// 从后往前依次拿到单个数字
let singleNum = integerPart[i];
// 单个数字转换成中文大写汉字
let chinessCapNum = nums[singleNum];
// 该数字后面应该接的单位:個、拾、佰、仟(其中‘個’这个单位就省略掉了,不需要展示,用空字符串替代)
let integerUtit = integerUtits[integerIndex % 4];
// 该数字后面应该额外接的单位:萬或者亿,第5位开始加萬,第9位开始加亿,再往后每四位切换使用萬和亿
let integerExtUtit = '';
if (integerIndex != 0) {
if (integerIndex % 8 == 0) {
integerExtUtit = '亿';
} else if (integerIndex % 4 == 0) {
integerExtUtit = '萬';
}
}
chineseIntegerArray[integerIndex] = chinessCapNum + integerUtit + integerExtUtit;
integerIndex++;
}
// console.log("chineseIntegerArray = ", chineseIntegerArray);
for (let i = chineseIntegerArray.length - 1; i >= 0; i--) {
chineseInteger += chineseIntegerArray[i];
}
// console.log("整数部分转大写汉字后的结果 = " + chineseInteger);
let chineseDecimal = '';
//判断有没有小数,如果有,则需要对小数部分做处理
if (parts.length == 2) {
const decimalUnits = ['角', '分', '毫', '厘'];
let decimalPart = parts[1];
let valildCount = decimalPart.length > 4 ? 4 : decimalPart.length;
for (let i = 0; i < valildCount; i++) {
chineseDecimal += nums[decimalPart[i]] + decimalUnits[i];
}
// console.log("小数部分转大写汉字后的结果 = " + chineseDecimal);
}
let fullChinessCap = chineseInteger + '圆' + chineseDecimal;
// console.log("完整大写汉字 = " + fullChinessCap);
let replacedChinessCap = fullChinessCap.replace(/零[角分毫厘]/g, '');
// console.log("replacedChinessCap 1 = " + replacedChinessCap);
replacedChinessCap = replacedChinessCap.replace(/零[仟佰拾]/g, '零');
// console.log("replacedChinessCap 2 = " + replacedChinessCap);
replacedChinessCap = replacedChinessCap.replace(/零+/g, '零');
// console.log("replacedChinessCap 3 = " + replacedChinessCap);
replacedChinessCap = replacedChinessCap.replace(/零萬/g, '萬');
// console.log("replacedChinessCap 4 = " + replacedChinessCap);
replacedChinessCap = replacedChinessCap.replace(/零亿/g, '亿');
// console.log("replacedChinessCap 5 = " + replacedChinessCap);
replacedChinessCap = replacedChinessCap.replace(/萬萬/g, '亿');
// console.log("replacedChinessCap 6 = " + replacedChinessCap);
replacedChinessCap = replacedChinessCap.replace(/零圆/g, '圆');
// console.log("replacedChinessCap 7 = " + replacedChinessCap);
replacedChinessCap = replacedChinessCap.replace(/亿萬/g, '亿');
// console.log("replacedChinessCap 8 = " + replacedChinessCap);
if (replacedChinessCap.startsWith("零圆")) {
replacedChinessCap = replacedChinessCap.replace(/零圆/, '');
}
if (replacedChinessCap.startsWith("圆")) {
replacedChinessCap = replacedChinessCap.replace(/圆/, '');
}
if (!replacedChinessCap || replacedChinessCap.length == 0) {
replacedChinessCap = "零圆";
}
return replacedChinessCap;
}
三、用法示例及运行结果
console.log(numToChinessCap("0.0201"));
// 贰分壹厘
console.log(numToChinessCap("123456789.010305"));
// 壹亿贰仟叁佰肆拾伍萬陆仟柒佰捌拾玖圆壹分叁厘
console.log(numToChinessCap("9099000000000000.220589"));
// 玖仟零玖拾玖萬亿圆贰角贰分伍厘
console.log(numToChinessCap("8061560189050150.0008"));
// 捌仟零陆拾壹萬伍仟陆佰零壹亿捌仟玖佰零伍萬零壹佰伍拾圆捌厘
console.log(numToChinessCap("100.0005"));
// 壹佰圆伍厘
console.log(numToChinessCap("0.0"));
// 零圆
console.log(numToChinessCap("0.002"));
// 贰毫
console.log(numToChinessCap("20000000.000"));
// 贰仟萬圆