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}