/** * 輸入需要轉化的數字 * @param num 傳入數字 * @returns {String} */ export function toChineseNum(num: number): string { if (typeof num !== 'number') { return ''; } if (num === 0) { return '零'; } const numberCharacter = [ '零', '一', '二', '三', '四', '五', '六', '七', '八', '九' ]; const textCharacter = [ '', '十', '百', '千' ]; const wordCharacter = [ '', '萬', '億' ]; /** * 輸入數組,返回按照位數分割的數組 * @param number 傳入的數字 * @param range 按照此位數將數字分割 * @returns {Array} 返回用逗號分隔的數組 */ const splitStr = (number: 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(); }; /** * 輸入一個四位數的數字,返回漢字表示 * @param item * @returns {string} */ const getChineseItem = (item: string) => { let temp = item .toString() .split('') .reverse() .map((value: any, index: number) => { // 如果數字是0, 后面的兩次就沒有必要加了,例如102中的0, 就不需要翻譯成為【零十】 return numberCharacter[value] + (Number(value) === 0 ? '' : textCharacter[index]); }) .reverse(); // 多個重復的零只保留一個 temp = temp.reduce((total: any[], current: string) => { if (total[total.length - 1] === '零' && current === '零') { return total; } total.push(current); return total; }, []); // 針對12,將結果由[一十二]修正為[十二] if (temp.length === 2) { temp[0] = temp[0].replace(/一十/, '十'); } // 結尾的零要忽略,針對10,將結果由[十零]修正為[十] 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(''); }