number-master

web application to practice korean numbers
git clone git://brookjeynes.dev/bjeynes/number-master.git
Log | Files | Refs | README | LICENSE

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 }