const BELOW20: [&str; 20] = [
"", "one", "two", "three", "four", "five", "six", "seven",
"eight", "nine", "ten", "eleven", "twelve", "thirteen",
"fourteen", "fifteen", "sixteen", "seventeen", "eighteen",
"nineteen",
];
const TENS: [&str; 10] = [
"", "", "twenty", "thirty", "forty", "fifty",
"sixty", "seventy", "eighty", "ninety",
];
fn set_below20_and_tens(num: i32) -> String {
if num == 0 {
"".to_string()
} else if num < 20 {
format!("{} ", BELOW20[num as usize])
} else if num < 100 {
format!(
"{} {}",
TENS[(num / 10) as usize],
set_below20_and_tens(num % 10)
)
} else {
format!(
"{} hundred {}",
BELOW20[(num / 100) as usize],
set_below20_and_tens(num % 100)
)
}
}
fn number_to_words(mut num: i32) -> String {
if num == 0 {
return "zero".to_string();
}
let mut result = String::new();
if num >= 1_000_000_000 {
result.push_str(&format!(
"{}billion ",
set_below20_and_tens(num / 1_000_000_000)
));
num %= 1_000_000_000;
}
if num >= 1_000_000 {
result.push_str(&format!(
"{}million ",
set_below20_and_tens(num / 1_000_000)
));
num %= 1_000_000;
}
if num >= 1000 {
result.push_str(&format!(
"{}thousand ",
set_below20_and_tens(num / 1000)
));
num %= 1000;
}
if num > 0 {
result.push_str(&set_below20_and_tens(num));
}
result.trim().to_string()
}
fn main() {
let n = 176_283;
println!("{}", number_to_words(n));
}
/*
run:
one hundred seventy six thousand two hundred eighty three
*/