前端面试题——阿拉伯数字转中文数字

2,416 阅读3分钟

前言

首先给大家看一下这个样例的通过情况。现在的代码1万亿以下估计都应该都满足,要是还想大就把单位数组再添点单位哈哈哈,这道题我是大体思路确定后,边写边考虑一些特殊情况的,可能代码还可以优化,大家可以去试着优化一下,反正总体思路应该没问题,感觉特殊的情况还是比较多,适合早上起床清醒的时候去模拟一下。

截屏2022-01-24 下午9.47.50.png

思路

举个例子大家估计都明白了。

一串数字比如说123412341234123412341234,思考一下就知道从个位数开始每4位数的规则其实是一样的,大家用中文表示一下这串数字,是一千二百三十四亿一千二百三十四一千二百三十四,很明显以万、亿等单位区分的区间转换的规则是一样的,所以我们就可以先考虑099990~9999这个区间的转换规则。

从千位到个位转换也行,从个位到千位转换也可以,我这里是从小到大转换的,当然我也建议大家从低位到高位去转换,会方便一点,举个例子,从低位到高位的好处是什么呢,就是一定是先有个位再有十位再有百位的,我们到最高位后就停止转换,就完成了,但是从高位到低位,我们不能保证所有的数字都一定是从某一位开始的,有可能是千位开始的,百位开始的,我们得考虑多种情况,所以推荐大家从低位开始转换,会方便很多。

其次,对于其中一些特殊的大概的有这几种情况。

  1. 1111,如果按照一个数字一个单位去放的话,这个数字会变成一十一,但是我们需要显示十一,所以需要排除当十位数是一且只有两位数字的时候,去掉前面的一。

  2. 10011001,中间有多个零,我们转换成中文数字的时候只需要一个汉字零,比如我们应该是一百零一,而不是一百零零一,所以需要在循环中去除重复的零。

  3. 10001000,还有这种情况去除重复的零后,会变成一千零,所以我们还得把最后一位是零且不只有零的这种情况的时候,去掉末尾的汉字零。

现在我们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('');
}

我是梨木,一个前端初学者,希望能在学习前端的过程中,留下自己的思考,给予你们帮助,以上文章若有错误,感谢指出!