63 lines
1.6 KiB
Rust
63 lines
1.6 KiB
Rust
pub fn a_or_an(word: &str) -> &'static str {
|
|
let vowels = ['a', 'e', 'i', 'o', 'u'];
|
|
let lowercase_word = word.to_lowercase();
|
|
|
|
// Special cases where the article should be "a"
|
|
let special_cases_a = vec!["one"];
|
|
if special_cases_a.contains(&lowercase_word.as_str()) {
|
|
return "a";
|
|
}
|
|
|
|
// Special cases where the article should be "an"
|
|
let special_cases_an = vec!["hour"];
|
|
if special_cases_an.contains(&lowercase_word.as_str()) {
|
|
return "an";
|
|
}
|
|
|
|
let first_char = lowercase_word.chars().next();
|
|
|
|
match first_char {
|
|
// If the first character is a vowel, return "an"
|
|
Some(c) if vowels.contains(&c) => "an",
|
|
// Otherwise, return "a"
|
|
_ => "a",
|
|
}
|
|
}
|
|
|
|
pub fn number_to_words(n: i32) -> String {
|
|
let ones = [
|
|
"", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine",
|
|
];
|
|
let teens = [
|
|
"ten",
|
|
"eleven",
|
|
"twelve",
|
|
"thirteen",
|
|
"fourteen",
|
|
"fifteen",
|
|
"sixteen",
|
|
"seventeen",
|
|
"eighteen",
|
|
"nineteen",
|
|
];
|
|
let tens = [
|
|
"", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety",
|
|
];
|
|
|
|
if n < 10 {
|
|
ones[n as usize].to_string()
|
|
} else if n < 20 {
|
|
teens[(n - 10) as usize].to_string()
|
|
} else if n < 100 {
|
|
let ten_part = tens[(n / 10) as usize];
|
|
let one_part = ones[(n % 10) as usize];
|
|
if n % 10 == 0 {
|
|
ten_part.to_string() // e.g., 20 → "twenty"
|
|
} else {
|
|
format!("{}-{}", ten_part, one_part) // e.g., 42 → "forty-two"
|
|
}
|
|
} else {
|
|
"Number out of range".to_string() // Handle numbers >= 100 (or extend the logic)
|
|
}
|
|
}
|