num_to_english/
lib.rs

1/// Converts single numbers and tens to their English names.
2/// For example, 3 becomes "three" and 40 becomes "forty".
3/// # Examples
4/// ```
5/// use num_to_english::name;
6/// assert_eq!(name(3), "three");
7/// assert_eq!(name(40), "forty");
8/// ```
9/// Note: This function only handles specific numbers and will return an empty string for unsupported inputs.
10/// 
11pub fn name(n: i8) -> &'static str {
12    match n {
13        0 => "zero",
14        1 => "one",
15        2 => "two",
16        3 => "three",
17        4 => "four",
18        5 => "five",
19        6 => "six",
20        7 => "seven",
21        8 => "eight",
22        9 => "nine",
23        10 => "ten",
24        11 => "eleven",
25        12 => "twelve",
26        13 => "thirteen",
27        14 => "fourteen",
28        15 => "fifteen",
29        16 => "sixteen",
30        17 => "seventeen",
31        18 => "eighteen",
32        19 => "nineteen",
33        20 => "twenty",
34        30 => "thirty",
35        40 => "forty",
36        50 => "fifty",
37        60 => "sixty",
38        70 => "seventy",
39        80 => "eighty",
40        90 => "ninety",
41        _ => "",
42    }
43}
44
45/// Converts an integer in the range 0-127 to its English representation.
46/// For example, 42 becomes "fortytwo" and 100 becomes "one hundred".
47/// Panics if the input is out of range.    
48/// # Examples
49/// ```
50/// use num_to_english::english;
51/// assert_eq!(english(42), (42, "fortytwo".to_string()));
52/// assert_eq!(english(100), (100, "one hundred".to_string()));
53/// ```
54/// # Panics
55/// ```should_panic
56/// use num_to_english::english;
57/// english(-128); // panics
58/// ```
59pub fn english(n: i8) -> (i8, String) {
60    match n {
61        0..=19 | 20 | 30 | 40 | 50 | 60 | 70 | 80 | 90 => (n, name(n).to_string()),
62
63        21..=99 => {
64            let tens = (n / 10) * 10;
65            let ones = n % 10;
66            (n, format!("{}{}", name(tens), name(ones)))
67        }
68
69        100..=127 => {
70            let rem = n - 100;
71            if rem == 0 {
72                (n, "one hundred".to_string())
73            } else {
74                (n, format!("one hundred {}", english(rem).1))
75            }
76        }
77
78        _ => panic!("out of range"),
79    }
80}
81
82#[cfg(test)]
83mod tests {
84    use super::*;
85
86    #[test]
87    fn st() {
88        assert_eq!(english(17), (17, "seventeen".to_string()));
89    }
90
91    #[test]
92    #[should_panic(expected = "out of range")]
93    fn negative() {
94        english(-1);
95    }
96}