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

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.lryc.cn/news/521149.html

相关文章:

  • 【自动化测试】—— Appium安装配置保姆教程(图文详解)
  • 贪心算法详细讲解(沉淀中)
  • RabbitMQ中有哪几种交换机类型?
  • STM32特殊功能引脚详解文章·STM32特殊功能引脚能当作GPIO使用嘛详解!!!
  • Qt QComboBox的QSS美化
  • 计算机视觉算法实战——实时车辆检测和分类(主页有相关源码)
  • what?ngify 比 axios 更好用,更强大?
  • 安装虚拟机VMware遇到的问题
  • 通过ESP32和INMP441麦克风模块实现音频数据传递
  • Vue中nextTick实现原理
  • 数据仓库基础常见面试题
  • Java设计模式——单例模式(特性、各种实现、懒汉式、饿汉式、内部类实现、枚举方式、双重校验+锁)
  • 数字普惠金融对新质生产力的影响研究(2015-2023年)
  • 国产编辑器EverEdit - 扩展脚本:新建同类型文件(避免编程学习者反复新建保存练习文件)
  • jupyter notebook练手项目:线性回归——学习时间与成绩的关系
  • dockerfile2.0
  • 【spring mvc】文件上传、下载
  • FPGA工程师成长四阶段
  • java fastjson2 解析JSON用法解析
  • 计算机视觉算法实战——步态识别(主页有源码)
  • LabVIEW水位监控系统
  • 网络层协议-----IP协议
  • 计算机网络八股文学习笔记
  • IntelliJ IDEA中Maven项目的配置、创建与导入全攻略
  • 如何在Jupyter中快速切换Anaconda里不同的虚拟环境
  • stack和queue专题
  • 【Vue】点击侧边导航栏,右侧main对应显示
  • 【Debug】django.db.utils.OperationalError: (1040, ‘Too many connections‘)
  • 如何开放2375和2376端口供Docker daemon监听
  • RabbitMQ确保消息可靠性