前言
首先给大家看一下这个样例的通过情况。现在的代码1万亿以下估计都应该都满足,要是还想大就把单位数组再添点单位哈哈哈,这道题我是大体思路确定后,边写边考虑一些特殊情况的,可能代码还可以优化,大家可以去试着优化一下,反正总体思路应该没问题,感觉特殊的情况还是比较多,适合早上起床清醒的时候去模拟一下。
思路
举个例子大家估计都明白了。
一串数字比如说,思考一下就知道从个位数开始每4位数的规则其实是一样的,大家用中文表示一下这串数字,是一千二百三十四亿一千二百三十四万一千二百三十四,很明显以万、亿等单位区分的区间转换的规则是一样的,所以我们就可以先考虑这个区间的转换规则。
从千位到个位转换也行,从个位到千位转换也可以,我这里是从小到大转换的,当然我也建议大家从低位到高位去转换,会方便一点,举个例子,从低位到高位的好处是什么呢,就是一定是先有个位再有十位再有百位的,我们到最高位后就停止转换,就完成了,但是从高位到低位,我们不能保证所有的数字都一定是从某一位开始的,有可能是千位开始的,百位开始的,我们得考虑多种情况,所以推荐大家从低位开始转换,会方便很多。
其次,对于其中一些特殊的大概的有这几种情况。
-
,如果按照一个数字一个单位去放的话,这个数字会变成
一十一,但是我们需要显示十一,所以需要排除当十位数是一且只有两位数字的时候,去掉前面的一。 -
,中间有多个零,我们转换成中文数字的时候只需要一个汉字零,比如我们应该是
一百零一,而不是一百零零一,所以需要在循环中去除重复的零。 -
,还有这种情况去除重复的零后,会变成
一千零,所以我们还得把最后一位是零且不只有零的这种情况的时候,去掉末尾的汉字零。
现在我们0~9999的数字大致已经构建完成了,然后将我们需要转换的数字从低位到高位4个分一组,然后将每组再用万、亿这些单位组和到一起,就可以构建出最后的答案啦!
let n = 123;
let arr = entrance(n);
console.log(arr); // 答案
function entrance(num) {
let arr = num.toString().split('').reverse().join('');
let curr = 0;
let x = [,'万','亿'];
let y = 0;
let res = [];
let answer = [];
while(curr < arr.length) {
res.push(NumToChina(arr.slice(curr,curr+4)));
curr+=4;
}
for(let i = res.length - 1;i >=0;i--) {
if(res[i] === '零' && res.length > 1) continue;
answer.push(i !== 0 ? res[i]+x[i] : res[i]);
}
return answer.join('');
}
function NumToChina(n) {
let unit = [,'十','百','千'];
let number = ['零','一','二','三','四','五','六','七','八','九']
let arr = n.toString().split('');
let res = [];
res.unshift(number[arr[0]]);
for(let i =1;i<arr.length;i++) {
if(arr[i] === '0' && arr[i-1] === '0') continue;
if(arr[i] === '0') {
res.unshift(number[arr[i]]);
} else {
res.unshift(unit[i]);
res.unshift(number[arr[i]]);
}
}
let len = res.length;
if(res[len-1] === '零' && len !== 1) res.pop();
if(arr.length === 2 && res[0] === '一') res.shift();
return res.join('');
}
我是梨木,一个前端初学者,希望能在学习前端的过程中,留下自己的思考,给予你们帮助,以上文章若有错误,感谢指出!