1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 阿拉伯数字转换为中文大写数字

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

时间:2024-04-03 13:48:39

相关推荐

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

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

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) { // 判断数字大于0number = 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 += '万'breakdefault:strNum += '亿'}}return strNum; // 此处输出的字符串小于一千的前面都会带个零,比如零壹佰}

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

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

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

123456789会变成

10010010001会变成

简单说一下思路

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。