当前位置: 首页 > article >正文

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


http://www.kler.cn/a/503226.html

相关文章:

  • 小结:华为路由器常用的操作指令
  • Redis :redis的大Key问题
  • Linux第二课:LinuxC高级 学习记录day01
  • ffmpeg常用命令及介绍
  • 计算机组成原理(九):乘法器
  • 从硬件设备看Linux
  • 简识MySQL的InnoDB Locking锁的分类
  • ue5 设置角色属性(生命值,蓝条值,能量值)c++
  • 基于WebRTC实现音视频通话
  • day01-HTML-CSS——基础标签样式表格标签表单标签
  • 斯坦福大学李飞飞教授团队ARCap: 利用增强现实反馈收集高质量的人类示教以用于机器人学习
  • 安装软件缺少msvcp110.dll怎么办?出现dll丢失的解决方法
  • LeetCode热题100(哈希篇)
  • unity学习18:unity里的 Debug.Log相关
  • 如何使用 Excel 进行多元回归分析?
  • 【数据结构】C语言顺序栈和链式栈的使用
  • 科技快讯 | 华为余承东2025新年信;教育部拟同意设置福耀科技大学等本科院校;我国成功发射一箭10星
  • <C++学习> C++ Boost 字符串操作教程
  • Day31补代码随想录20250110贪心算法5 56.合并区间|738.单调递增的数字|968.监控二叉树(可跳过)
  • LoRaWAN节点学习笔记
  • ASP.NET Core - 日志记录系统(一)
  • leetcode 面试经典 150 题:快乐数
  • 云服务信息安全管理体系认证,守护云端安全
  • npm、yarn、pnpm包安装器差异性对比
  • 深度学习中的卷积神经网络(CNN):原理与应用详解
  • 如何使用虚拟机连接到SSH