How to convert an integer into its written‑out English words in Rust

1 Answer

0 votes
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

*/

 



answered May 5 by avibootz
...