今天在财务跑账。财务的妹纸让我填大写的数字,瞬间不知道怎么填,对比着提示单,一个字一个字写了下来。
看着财务妹纸微笑着迷妹一般的望着我,我不仅陷入了沉思.......干脆写个JavaScript代码,来转换数字为大写的汉字吧。
说干就干~!
第一步:构造数据。雷打不同的数据,自然使用const定义为常量。
const dataArr = ["零","壹","贰","叁","肆","伍","陆","柒","捌","玖"];
const danweiArr = ["","拾","佰","仟"] ;
const WanArr = ["","万","亿","万亿"];
第二步:把阿拉伯数字转为汉字,且每四位添加一个逗号隔开。
这个习惯跟西方不一样。中文的数字,是4个一组的。比如,12312,中文是“一万两千三百一十二” ,就是 1,2312分组的。
/*
* changeNumToString 方法:
* 把阿拉伯数字转为汉字,且每四位添加一个逗号隔开。
* 参数:num,字符串形式的数字
* */
let changeNumToString = function(num){
let res = [];
// 数数的变量
let index = 0;
// 遍历字符串num。因为数学习惯,大数在左边,小数在右边,所以逆向遍历数字。
for(let i=num.length-1 ; i >=0 ; i--){
// 挨个获取数字,并且转为汉字
let n = Number(num.charAt(i) );
let dataNum = dataArr[n];
res.unshift(dataNum);
// 数数,判断是不是4和4的倍数。
// 是,添加逗号在前面。但是,开头不能是逗号。
// 所以,index的值不能跟字符串长度一致
index++;
if( index % 4 === 0 && index !== num.length ){
res.unshift(",");
}
}
return res.join("");
};
第三步:把四位数字变X仟X百X拾X。注意对“零”的处理。
/*
* changeNumToBai 方法,把四位数字变X仟X百X拾X
* 参数:numHanZi ,汉字形式的数字。
* */
let changeNumToBai = function(numHanZi){
let len = numHanZi.length;
let newStr = "";
// 是否已经对零进行了处理。
let hasLing = false;
for(let i=0 ; i <= len-1 ; i++){
// 如果为“零”,且没有对零处理
if( numHanZi[i] === dataArr[0] && hasLing === false ){
newStr += numHanZi[i];
hasLing=true;
// 如果为“零”,且已经对零处理了,就直接跳过该数字。
// 如 1002, 就只会是 一千零二,只有一个汉字“零”。
}else if( numHanZi[i] === dataArr[0] && hasLing === true){
continue;
}else{
newStr += numHanZi[i]+danweiArr[len-1-i];
}
}
return newStr;
};
第四步:利用前面的函数,把数字转为汉字
/*
* 把数字转为汉字
* */
let numToString = function(num){
let numString = changeNumToString(num);
// 把数字字符串用逗号切割成数组
let arr = numString.split(",");
let res = [];
let wanIndex = 0 ;
// 逆向处理数字。先从小位上的数开始。
for(let i=arr.length-1 ; i>=0 ; i--){
// 把数字变为 X仟X百X拾X
let smallString = changeNumToBai( arr[i] );
// 添加“万,亿”等单位
smallString += WanArr[wanIndex];
wanIndex++;
// 因为是从小到大处理数据,把结果插入到数组的头部。
res.unshift(smallString);
}
return res.join("");
};
console.info( numToString("2121031002") );
// 贰拾壹亿贰仟壹佰零叁万壹仟零贰
完美~收工~!
在财务妹子的一片赞叹中,我.........一个寒颤我醒了,太冷了,没关窗,这个雨下的,夏天硬是活成了冬天~唉~
THE END.