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}