阿拉伯数字转换为中文大写数字

这个功能使用场景不多,百度也能找到很多相关代码,只不过我找了几个看的不是很明白,为了锻炼自己的思维能力,所以就干脆自己写了一个,不仅分享代码,同时也分享一下我的思路

JS代码

let moneyCaseFold = (num) => { // 存在精度问题,拾万亿级数字可用
				let regZero = new RegExp('零')
			  	num = num.toString().replace(new RegExp(',', 'g'), '').replace(/^\s+|\s+$/g, '').split('').reverse().join(''); // 替换num中的“,”与空格将其拆分为数组倒序后组成字符串
			  	let numArr = []; // 存储中文数字
			  	let chineseMoney = ''; // 中文数字字符串
			  	for (let i = 0; i < num.length/4; i++) { // 将数字拆分为4个一组的字符串数组
			  		numArr[i] = numberToChinese(num.substring(i * 4, (i + 1) * 4), i); // 拆分数字为个十百千一组,统一进行处理
			  	}
			  	chineseMoney = numArr.reverse().join('').replace(new RegExp('零亿', 'g'), '').replace(new RegExp('零万', 'g'), ''); // 中文数字数组倒序拼接,移除所有零万和零亿字符
			  	if (regZero.test(chineseMoney[0])) { // 判断字符串第一位是否为零,是零则删除
			  		chineseMoney = chineseMoney.substring(1, chineseMoney.length);
			  	}
			  $('#money').text(chineseMoney)
			}
			// 处理个十百千转为中文数字的方法
			let numberToChinese = (str, index) => {
				let chineseUppercaseNumber = '零壹贰叁肆伍陆柒捌玖'; // 中文大写数字
				let strArr = str.padEnd(4, '0').split(''); // 用零补全数字至四位,ES6方法,可用普通方法替代
				let zeroCount = 0; // 计数,记录0出现的次数
				let strNumArr = []; // 保存阿拉伯数字转为的中文数字
				let regZero = new RegExp('零') // 判断零是否存在
				// 处理阿拉伯数字,先将其转为中文数字,具体文字中零的处理交由数组strNumArr拼接的字符串进行处理
				for (let i = 0; i < strArr.length; i++) { // 循环遍历补全后的阿拉伯数字
					let number = ''; // 当前数字转为的中文数字保存位置
					if (strArr[i] > 0) { // 判断数字大于0
						number = chineseUppercaseNumber[strArr[i]];	// 将数字转为中文,如0->零,1->壹
						switch (i) { // 判断位数,给对应数字添加十百千
					        case 1:
					          number += '拾';
					          break;
					        case 2:
					          number += '佰';
				              break;
				            case 3:
				              number += '仟';
				        }
			          	if (zeroCount > 0) { // 判断前一位数字是否为0,是0的话,清空零计数器,在当前数字后添加零
			          		zeroCount = 0;
							number += '零';								          
			          	}
			       } else { // 小于0,零计数器自增
			          zeroCount++
			        }
			        strNumArr.push(number); // 将中文数字存入数组
				}
				let strNum = strNumArr.reverse().join(''); // 数组倒序拼接为字符串,开始处理字符串
				// 下面这段代码自我感觉有问题,不过不影响结果
				if (strArr[3] == 0) { // 判断千位数为0的情况,为其添加一个零
					strNum = '零' + strNum
				}
				if (regZero.test(strNum[strNum.length - 1])) { // 处理掉了以零结尾的字符串的结尾的零
					strNum = strNum.substring(0, strNum.length - 1);  
				}
				console.log(strNum)
				if (index > 0) { // 传入的当前数字在原数字的位置,判断是否应该添加万和亿的单位,万位一下不做处理
					if (strNum.length < 1) { // 全部为0的数字保留一个零,便于后续处理零万和零亿字符时更方便
						strNum = '零';
					}
			        switch (index % 2) { // 添加万和亿
			           case 1:
			              strNum += '万'
			              break
			           default:
			              strNum += '亿'
			        }
			    }
				return strNum; // 此处输出的字符串小于一千的前面都会带个零,比如零壹佰
			}

这段代码我进行了一些测试,没碰到什么错误,不过数字仅限于一万亿以下的正整数的数字测试,特别大的数字必然有问题,(因为我在代码里会清除零万和零亿字符,一万亿会变成一万,需要万亿以上的自行修改代码)不过一般也用不到那么大的数字

我虽然进行了一些测试,可是并不保证代码在所有情况下一定正确,所以了解思路才是正确的做法

大概效果如下,比如9999999999会变成

123456789会变成

10010010001会变成

简单说一下思路

虽然我已经详细注释了,但还是简单说一下思路,对于中文数字来说,个十百千是一个整体,不论是千万还是千亿,个十百千的处理方式始终是一样的,后面再添加万和亿的单位就没问题了,所以统一处理个十百千,添加对应万和亿的单位,再将处理完成的字符串清理掉不合理的字符,就是我们想要的结果

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值