|
| 1 | +function recursiveNumToWords(amount: number): string { |
| 2 | + const numberInText = [ |
| 3 | + "", |
| 4 | + "satu", |
| 5 | + "dua", |
| 6 | + "tiga", |
| 7 | + "empat", |
| 8 | + "lima", |
| 9 | + "enam", |
| 10 | + "tujuh", |
| 11 | + "delapan", |
| 12 | + "sembilan", |
| 13 | + "sepuluh", |
| 14 | + "sebelas", |
| 15 | + ]; |
| 16 | + |
| 17 | + if (amount < 12) { |
| 18 | + return numberInText[amount] as string; |
| 19 | + } |
| 20 | + if (amount < 20) { |
| 21 | + return recursiveNumToWords(amount - 10) + " belas"; |
| 22 | + } |
| 23 | + if (amount < 100) { |
| 24 | + return ( |
| 25 | + recursiveNumToWords(Math.floor(amount / 10)) + |
| 26 | + " puluh " + |
| 27 | + recursiveNumToWords(amount % 10) |
| 28 | + ); |
| 29 | + } |
| 30 | + if (amount < 200) { |
| 31 | + return "seratus " + recursiveNumToWords(amount - 100); |
| 32 | + } |
| 33 | + if (amount < 1_000) { |
| 34 | + return ( |
| 35 | + recursiveNumToWords(Math.floor(amount / 100)) + |
| 36 | + " ratus " + |
| 37 | + recursiveNumToWords(amount % 100) |
| 38 | + ); |
| 39 | + } |
| 40 | + if (amount < 2_000) { |
| 41 | + return "seribu " + recursiveNumToWords(amount - 1_000); |
| 42 | + } |
| 43 | + if (amount < 1_000_000) { |
| 44 | + return ( |
| 45 | + recursiveNumToWords(Math.floor(amount / 1_000)) + |
| 46 | + " ribu " + |
| 47 | + recursiveNumToWords(amount % 1_000) |
| 48 | + ); |
| 49 | + } |
| 50 | + if (amount < 1_000_000_000) { |
| 51 | + return ( |
| 52 | + recursiveNumToWords(Math.floor(amount / 1_000_000)) + |
| 53 | + " juta " + |
| 54 | + recursiveNumToWords(amount % 1_000_000) |
| 55 | + ); |
| 56 | + } |
| 57 | + if (amount < 1_000_000_000_000) { |
| 58 | + return ( |
| 59 | + recursiveNumToWords(Math.floor(amount / 1_000_000_000)) + |
| 60 | + " milyar " + |
| 61 | + recursiveNumToWords(amount % 1_000_000_000) |
| 62 | + ); |
| 63 | + } |
| 64 | + if (amount < 1_000_000_000_000) { |
| 65 | + return ( |
| 66 | + recursiveNumToWords(Math.floor(amount / 1_000_000_000_000)) + |
| 67 | + " trilyun " + |
| 68 | + recursiveNumToWords(amount % 1_000_000_000_000) |
| 69 | + ); |
| 70 | + } |
| 71 | + return ""; |
| 72 | +} |
| 73 | + |
| 74 | +function trimExcessSpaces(input: string): string { |
| 75 | + return input.replace(/ +/g, " ").trim(); |
| 76 | +} |
| 77 | + |
| 78 | +function numberToWords(amount: number): string { |
| 79 | + return trimExcessSpaces(recursiveNumToWords(amount)); |
| 80 | +} |
| 81 | + |
| 82 | +// test |
| 83 | +// console.log(numberToWords(200_000)); |
| 84 | +// console.log(numberToWords(250_000)); |
| 85 | +// console.log(numberToWords(252_000)); |
| 86 | +console.log(numberToWords(200_000) === "dua ratus ribu"); |
| 87 | +console.log(numberToWords(250_000) === "dua ratus lima puluh ribu"); |
| 88 | +console.log(numberToWords(252_000) === "dua ratus lima puluh dua ribu"); |
| 89 | +console.log(numberToWords(2_000_000) === "dua juta"); |
| 90 | +console.log(numberToWords(250_000_001) === "dua ratus lima puluh juta satu"); |
| 91 | +console.log( |
| 92 | + numberToWords(11_987_654) === |
| 93 | + "sebelas juta sembilan ratus delapan puluh tujuh ribu enam ratus lima puluh empat" |
| 94 | +); |
0 commit comments