sino.js (1394B)
1 /** 2 * @param {number} num 3 * @returns {string} 4 */ 5 export function sinoStringFromNumber(num) { 6 const UNITS = ["", "일", "이", "삼", "사", "오", "육", "칠", "팔", "구"]; 7 const SMALL = ["", "십", "백", "천"]; 8 const LARGE = ["", "만", "억", "조"]; 9 10 if (num === 0) return "영"; 11 12 /** 13 * Holds the number split into groups of four ordered by least significant 14 * group. 15 * @type {number[]} 16 */ 17 const groups = []; 18 /** @type {number} */ 19 let temp = num; 20 while (temp > 0) { 21 groups.push(temp % 1_0000); 22 temp = Math.floor(temp / 1_0000) 23 } 24 25 /** @type {string[]} */ 26 let result = []; 27 for (let g = groups.length - 1; g >= 0; g--) { 28 /** @type {number} */ 29 const group = groups[g]; 30 if (group === 0) continue; 31 32 /** @type {number[]} */ 33 const digits = [ 34 Math.floor(group / 1000), // 천 35 Math.floor((group % 1000) / 100), // 백 36 Math.floor((group % 100) / 10), // 십 37 group % 10, // 일 38 ] 39 40 /** @type {string} */ 41 let groupStr = ""; 42 for (let d = 0; d < 4; d++) { 43 /** @type {number} */ 44 const digit = digits[d]; 45 if (digit === 0) continue; 46 47 /** 48 * Drop 일 before 십/백/천, but keep it before 만/억/조 49 * @type {string} 50 */ 51 const prefix = (digit === 1 && d > 0 && d < 3) ? "" : UNITS[digit]; 52 groupStr += prefix + SMALL[3 - d]; 53 } 54 55 result.push(groupStr + LARGE[g]); 56 } 57 58 return result.join(" "); 59 }