import Foundation
let below20 = [
"", "one", "two", "three", "four", "five", "six", "seven",
"eight", "nine", "ten", "eleven", "twelve", "thirteen",
"fourteen", "fifteen", "sixteen", "seventeen", "eighteen",
"nineteen"
]
let tens = [
"", "", "twenty", "thirty", "forty", "fifty",
"sixty", "seventy", "eighty", "ninety"
]
func setBelow20AndTens(_ num: Int) -> String {
switch num {
case 0:
return ""
case 1..<20:
return below20[num] + " "
case 20..<100:
return tens[num / 10] + " " + setBelow20AndTens(num % 10)
default:
return below20[num / 100] + " hundred " + setBelow20AndTens(num % 100)
}
}
func numberToWords(_ n: Int) -> String {
if n == 0 { return "zero" }
var num = n
var result = ""
if num >= 1_000_000_000 {
result += setBelow20AndTens(num / 1_000_000_000) + "billion "
num %= 1_000_000_000
}
if num >= 1_000_000 {
result += setBelow20AndTens(num / 1_000_000) + "million "
num %= 1_000_000
}
if num >= 1000 {
result += setBelow20AndTens(num / 1000) + "thousand "
num %= 1000
}
if num > 0 {
result += setBelow20AndTens(num)
}
return result.trimmingCharacters(in: .whitespaces)
}
let n = 176_283
print(numberToWords(n))
/*
run:
one hundred seventy six thousand two hundred eighty three
*/