/**
* 輸入需要轉化的數字
* @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('');
}