inflector/numbers/ordinalize/
mod.rs

1/// Orginalizes a `&str`
2///
3/// ```
4///     use inflector::numbers::ordinalize::ordinalize;
5///     let mock_string: &str = "a";
6///     let expected_string: String = "a".to_owned();
7///     let asserted_string: String = ordinalize(mock_string);
8///     assert!(asserted_string == expected_string);
9///
10/// ```
11/// ```
12///     use inflector::numbers::ordinalize::ordinalize;
13///     let mock_string: &str = "0.1";
14///     let expected_string: String = "0.1".to_owned();
15///     let asserted_string: String = ordinalize(mock_string);
16///     assert!(asserted_string == expected_string);
17///
18/// ```
19/// ```
20///     use inflector::numbers::ordinalize::ordinalize;
21///     let mock_string: &str = "-1";
22///     let expected_string: String = "-1st".to_owned();
23///     let asserted_string: String = ordinalize(mock_string);
24///     assert!(asserted_string == expected_string);
25///
26/// ```
27/// ```
28///     use inflector::numbers::ordinalize::ordinalize;
29///     let mock_string: &str = "0";
30///     let expected_string: String = "0th".to_owned();
31///     let asserted_string: String = ordinalize(mock_string);
32///     assert!(asserted_string == expected_string);
33///
34/// ```
35/// ```
36///     use inflector::numbers::ordinalize::ordinalize;
37///     let mock_string: &str = "1";
38///     let expected_string: String = "1st".to_owned();
39///     let asserted_string: String = ordinalize(mock_string);
40///     assert!(asserted_string == expected_string);
41///
42/// ```
43/// ```
44///     use inflector::numbers::ordinalize::ordinalize;
45///     let mock_string: &str = "2";
46///     let expected_string: String = "2nd".to_owned();
47///     let asserted_string: String = ordinalize(mock_string);
48///     assert!(asserted_string == expected_string);
49///
50/// ```
51/// ```
52///     use inflector::numbers::ordinalize::ordinalize;
53///     let mock_string: &str = "3";
54///     let expected_string: String = "3rd".to_owned();
55///     let asserted_string: String = ordinalize(mock_string);
56///     assert!(asserted_string == expected_string);
57///
58/// ```
59/// ```
60///     use inflector::numbers::ordinalize::ordinalize;
61///     let mock_string: &str = "9";
62///     let expected_string: String = "9th".to_owned();
63///     let asserted_string: String = ordinalize(mock_string);
64///     assert!(asserted_string == expected_string);
65///
66/// ```
67/// ```
68///     use inflector::numbers::ordinalize::ordinalize;
69///     let mock_string: &str = "12";
70///     let expected_string: String = "12th".to_owned();
71///     let asserted_string: String = ordinalize(mock_string);
72///     assert!(asserted_string == expected_string);
73///
74/// ```
75/// ```
76///     use inflector::numbers::ordinalize::ordinalize;
77///     let mock_string: &str = "12000";
78///     let expected_string: String = "12000th".to_owned();
79///     let asserted_string: String = ordinalize(mock_string);
80///     assert!(asserted_string == expected_string);
81///
82/// ```
83/// ```
84///     use inflector::numbers::ordinalize::ordinalize;
85///     let mock_string: &str = "12001";
86///     let expected_string: String = "12001st".to_owned();
87///     let asserted_string: String = ordinalize(mock_string);
88///     assert!(asserted_string == expected_string);
89///
90/// ```
91/// ```
92///     use inflector::numbers::ordinalize::ordinalize;
93///     let mock_string: &str = "12002";
94///     let expected_string: String = "12002nd".to_owned();
95///     let asserted_string: String = ordinalize(mock_string);
96///     assert!(asserted_string == expected_string);
97///
98/// ```
99/// ```
100///     use inflector::numbers::ordinalize::ordinalize;
101///     let mock_string: &str = "12003";
102///     let expected_string: String = "12003rd".to_owned();
103///     let asserted_string: String = ordinalize(mock_string);
104///     assert!(asserted_string == expected_string);
105///
106/// ```
107/// ```
108///     use inflector::numbers::ordinalize::ordinalize;
109///     let mock_string: &str = "12004";
110///     let expected_string: String = "12004th".to_owned();
111///     let asserted_string: String = ordinalize(mock_string);
112///     assert!(asserted_string == expected_string);
113///
114/// ```
115pub fn ordinalize(non_ordinalized_string: &str) -> String {
116    let chars: Vec<char> = non_ordinalized_string.clone().chars().collect();
117    let last_number: char = chars[chars.len() - 1];
118    if is_ordinalizable(last_number) {
119        return non_ordinalized_string.to_owned();
120    }
121    if chars.len() > 1 {
122        if second_last_number_is_one(chars) {
123            return format!("{}{}", non_ordinalized_string, "th");
124        } else if string_contains_decimal(non_ordinalized_string.to_owned()) {
125            return non_ordinalized_string.to_owned();
126        }
127    }
128    match last_number {
129        '1' => format!("{}{}", non_ordinalized_string, "st"),
130        '2' => format!("{}{}", non_ordinalized_string, "nd"),
131        '3' => format!("{}{}", non_ordinalized_string, "rd"),
132        _ => format!("{}{}", non_ordinalized_string, "th"),
133    }
134}
135
136fn is_ordinalizable(last_number: char) -> bool {
137    !last_number.is_numeric()
138}
139
140fn second_last_number_is_one(chars: Vec<char>) -> bool {
141    let second_last_number: char = chars[chars.len() - 2];
142    second_last_number == '1'
143}
144
145fn string_contains_decimal(non_ordinalized_string: String) -> bool {
146    non_ordinalized_string.contains('.')
147}