算法練習(xí)03 把數(shù)字轉(zhuǎn)換成中文

題目(2018-11-18)

完成將toChineseNum,可以將數(shù)字轉(zhuǎn)換成中文大寫的表示,處理到萬(wàn)級(jí)別,例如toChineseNum(12345),返回一萬(wàn)二千三百四十五。

實(shí)現(xiàn)

將數(shù)字按照四位分成一組,存放在輸入中,每一項(xiàng)的處理邏輯其實(shí)是相同的,無(wú)非是根據(jù)最后不同的位置,添加不同的單位即可

分組的過(guò)程涉及到了上一個(gè)聯(lián)系的內(nèi)容,將數(shù)組每四位分成一組

在對(duì)四位數(shù)字組成的一項(xiàng)進(jìn)行處理時(shí),有一些特殊的情況需要關(guān)注

最終的代碼:

const toChineseNum = (num) => {
  if (typeof num !== 'number') {
    return ''
  }
  if (num === 0) {
    return '零'
  }
  const numberCharacter = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'],
  textCharacter = ['', '十', '百', '千'],
  wordCharacter = ['', '萬(wàn)', '億'];

  /**
   * 輸入數(shù)組,返回按照位數(shù)分割的數(shù)組
   * @param number 傳入的數(shù)字
   * @param range 按照此位數(shù)將數(shù)字分割
   * @returns {Array} 返回用逗號(hào)分隔的數(shù)組
   */
  const splitStr = (number, range = 4) => {
    let str = number.toString();

    const[left] = str.split('.');

    const strArr = left.split('').reverse();

    let result = [];
    for (let i = 0; i < strArr.length; i += range) {
      result.push(strArr.slice(i, i + range).reverse().join(''))
    }
    return result.reverse()
  };

  /**
   * 輸入一個(gè)四位數(shù)的數(shù)字,返回漢字表示
   * @param item
   * @returns {string}
   */
  const getChineseItem = item => {
    let temp = item.toString().split('').reverse().map((value, index) = > {
      // 如果數(shù)字是0, 后面的兩次就沒(méi)有必要加了,例如102中的0, 就不需要翻譯成為【零十】
      return numberCharacter[value] + (+value === 0 ? '' : textCharacter[index])
    }).reverse();

    // 多個(gè)重復(fù)的零只保留一個(gè)
    temp = temp.reduce((total, current) => {
      if (total[total.length - 1] === '零' && current === '零') {
        return total
      }
      total.push(current);
      return total
    }, []);

    // 針對(duì)12,將結(jié)果由[一十二]修正為[十二]
    if (temp.length === 2) {
      temp[0] = temp[0].replace(/一十/, '十')
    }

    // 結(jié)尾的零要忽略,針對(duì)10,將結(jié)果由[十零]修正為[十]
    if (temp[temp.length - 1] === '零') {
      temp.pop()
    }

    return temp.join('')
  };

  let splitArr = splitStr(num).reverse();
  return splitArr.map(v = > getChineseItem(v)).map((v, index) = > v + wordCharacter[index]).reverse().join('');
};
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容