object NumberToWords {
private val below20: Vector[String] =
Vector("", "one", "two", "three", "four", "five", "six", "seven",
"eight", "nine", "ten", "eleven", "twelve", "thirteen",
"fourteen", "fifteen", "sixteen", "seventeen", "eighteen",
"nineteen")
private val tens: Vector[String] =
Vector("", "", "twenty", "thirty", "forty", "fifty",
"sixty", "seventy", "eighty", "ninety")
def setBelow20AndTens(num: Int): String = num match {
case 0 => ""
case n if n < 20 =>
below20(n) + " "
case n if n < 100 =>
tens(n / 10) + " " + setBelow20AndTens(n % 10)
case n =>
below20(n / 100) + " hundred " + setBelow20AndTens(n % 100)
}
def numberToWords(num: Int): String = {
if (num == 0) "zero"
else {
val parts =
List(
if (num >= 1000000000) Some(setBelow20AndTens(num / 1000000000) + "billion ") else None,
if (num % 1000000000 >= 1000000) Some(setBelow20AndTens((num % 1000000000) / 1000000) + "million ") else None,
if (num % 1000000 >= 1000) Some(setBelow20AndTens((num % 1000000) / 1000) + "thousand ") else None,
if (num % 1000 > 0) Some(setBelow20AndTens(num % 1000)) else None
).flatten
parts.mkString.trim
}
}
def main(args: Array[String]): Unit = {
val n = 176283
println(numberToWords(n))
}
}
/*
run:
one hundred seventy six thousand two hundred eighty three
*/