題目(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('');
};