val below20 = listOf(
"", "one", "two", "three", "four", "five", "six", "seven",
"eight", "nine", "ten", "eleven", "twelve", "thirteen",
"fourteen", "fifteen", "sixteen", "seventeen", "eighteen",
"nineteen"
)
val tens = listOf(
"", "", "twenty", "thirty", "forty", "fifty",
"sixty", "seventy", "eighty", "ninety"
)
fun setBelow20AndTens(num: Int): String =
when {
num == 0 -> ""
num < 20 -> below20[num] + " "
num < 100 -> tens[num / 10] + " " + setBelow20AndTens(num % 10)
else -> below20[num / 100] + " hundred " + setBelow20AndTens(num % 100)
}
fun numberToWords(n: Int): String {
if (n == 0) return "zero"
var num = n
val result = StringBuilder()
if (num >= 1_000_000_000) {
result.append(setBelow20AndTens(num / 1_000_000_000)).append("billion ")
num %= 1_000_000_000
}
if (num >= 1_000_000) {
result.append(setBelow20AndTens(num / 1_000_000)).append("million ")
num %= 1_000_000
}
if (num >= 1000) {
result.append(setBelow20AndTens(num / 1000)).append("thousand ")
num %= 1000
}
if (num > 0) {
result.append(setBelow20AndTens(num))
}
return result.toString().trim()
}
fun main() {
val n = 176_283
println(numberToWords(n))
}
/*
run:
one hundred seventy six thousand two hundred eighty three
*/