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"));
// 贰仟萬圆

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

却染人间愁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值