chinese_number/number_to_chinese/
traits.rs

1use super::*;
2
3/// 讓 Rust 程式語言的所有基本數值型別擁有轉成中文數字的能力。
4pub trait NumberToChinese {
5    /// 將數值轉成中文數字。
6    ///
7    /// * 如果使用 **「下數」**,則數值的絕對值不能大於或等於 `1_0000_0000_0000_0000`。
8    /// * 如果使用 **「萬進」**,則數值的絕對值不能大於或等於 `1e52`。
9    /// * 如果使用 **「中數」**,則數值的絕對值不能大於或等於 `1e96`。
10    ///
11    /// ## 範例
12    ///
13    /// ```rust
14    /// use chinese_number::{ChineseCase, ChineseCountMethod, ChineseVariant, NumberToChinese};
15    ///
16    /// assert_eq!("一百二十三京四千五百六十七兆八千九百零一億二千三百四十五萬六千七百八十九", 1234567890123456789u64.to_chinese(ChineseVariant::Traditional, ChineseCase::Lower, ChineseCountMethod::TenThousand).unwrap());
17    /// ```
18    fn to_chinese(
19        self,
20        chinese_variant: ChineseVariant,
21        chinese_case: ChineseCase,
22        method: ChineseCountMethod,
23    ) -> Result<String, NumberToChineseError>;
24
25    /// 將數值直接轉成中文數字,不進行單位計算。
26    ///
27    /// ## 範例
28    ///
29    /// ```rust
30    /// use chinese_number::{
31    ///     ChineseCase, ChineseCountMethod, ChineseVariant, NumberToChinese,
32    /// };
33    ///
34    /// assert_eq!(
35    ///     "一二三四五六七八九",
36    ///     123456789
37    ///         .to_chinese_naive(ChineseVariant::Traditional, ChineseCase::Lower)
38    /// );
39    /// ```
40    fn to_chinese_naive(self, chinese_variant: ChineseVariant, chinese_case: ChineseCase)
41        -> String;
42}
43
44impl NumberToChinese for u8 {
45    #[inline]
46    fn to_chinese(
47        self,
48        chinese_variant: ChineseVariant,
49        chinese_case: ChineseCase,
50        method: ChineseCountMethod,
51    ) -> Result<String, NumberToChineseError> {
52        (self as u128).to_chinese(chinese_variant, chinese_case, method)
53    }
54
55    #[inline]
56    fn to_chinese_naive(
57        self,
58        chinese_variant: ChineseVariant,
59        chinese_case: ChineseCase,
60    ) -> String {
61        from_u8_to_chinese_naive(chinese_variant, chinese_case, self)
62    }
63}
64
65impl NumberToChinese for i8 {
66    #[inline]
67    fn to_chinese(
68        self,
69        chinese_variant: ChineseVariant,
70        chinese_case: ChineseCase,
71        method: ChineseCountMethod,
72    ) -> Result<String, NumberToChineseError> {
73        (self as i128).to_chinese(chinese_variant, chinese_case, method)
74    }
75
76    #[inline]
77    fn to_chinese_naive(
78        self,
79        chinese_variant: ChineseVariant,
80        chinese_case: ChineseCase,
81    ) -> String {
82        from_i8_to_chinese_naive(chinese_variant, chinese_case, self)
83    }
84}
85
86impl NumberToChinese for u16 {
87    #[inline]
88    fn to_chinese(
89        self,
90        chinese_variant: ChineseVariant,
91        chinese_case: ChineseCase,
92        method: ChineseCountMethod,
93    ) -> Result<String, NumberToChineseError> {
94        (self as u128).to_chinese(chinese_variant, chinese_case, method)
95    }
96
97    #[inline]
98    fn to_chinese_naive(
99        self,
100        chinese_variant: ChineseVariant,
101        chinese_case: ChineseCase,
102    ) -> String {
103        from_u16_to_chinese_naive(chinese_variant, chinese_case, self)
104    }
105}
106
107impl NumberToChinese for i16 {
108    #[inline]
109    fn to_chinese(
110        self,
111        chinese_variant: ChineseVariant,
112        chinese_case: ChineseCase,
113        method: ChineseCountMethod,
114    ) -> Result<String, NumberToChineseError> {
115        (self as i128).to_chinese(chinese_variant, chinese_case, method)
116    }
117
118    #[inline]
119    fn to_chinese_naive(
120        self,
121        chinese_variant: ChineseVariant,
122        chinese_case: ChineseCase,
123    ) -> String {
124        from_i16_to_chinese_naive(chinese_variant, chinese_case, self)
125    }
126}
127
128impl NumberToChinese for u32 {
129    #[inline]
130    fn to_chinese(
131        self,
132        chinese_variant: ChineseVariant,
133        chinese_case: ChineseCase,
134        method: ChineseCountMethod,
135    ) -> Result<String, NumberToChineseError> {
136        (self as u128).to_chinese(chinese_variant, chinese_case, method)
137    }
138
139    #[inline]
140    fn to_chinese_naive(
141        self,
142        chinese_variant: ChineseVariant,
143        chinese_case: ChineseCase,
144    ) -> String {
145        from_u32_to_chinese_naive(chinese_variant, chinese_case, self)
146    }
147}
148
149impl NumberToChinese for i32 {
150    #[inline]
151    fn to_chinese(
152        self,
153        chinese_variant: ChineseVariant,
154        chinese_case: ChineseCase,
155        method: ChineseCountMethod,
156    ) -> Result<String, NumberToChineseError> {
157        (self as i128).to_chinese(chinese_variant, chinese_case, method)
158    }
159
160    #[inline]
161    fn to_chinese_naive(
162        self,
163        chinese_variant: ChineseVariant,
164        chinese_case: ChineseCase,
165    ) -> String {
166        from_i32_to_chinese_naive(chinese_variant, chinese_case, self)
167    }
168}
169
170impl NumberToChinese for u64 {
171    #[inline]
172    fn to_chinese(
173        self,
174        chinese_variant: ChineseVariant,
175        chinese_case: ChineseCase,
176        method: ChineseCountMethod,
177    ) -> Result<String, NumberToChineseError> {
178        (self as u128).to_chinese(chinese_variant, chinese_case, method)
179    }
180
181    #[inline]
182    fn to_chinese_naive(
183        self,
184        chinese_variant: ChineseVariant,
185        chinese_case: ChineseCase,
186    ) -> String {
187        from_u64_to_chinese_naive(chinese_variant, chinese_case, self)
188    }
189}
190
191impl NumberToChinese for i64 {
192    #[inline]
193    fn to_chinese(
194        self,
195        chinese_variant: ChineseVariant,
196        chinese_case: ChineseCase,
197        method: ChineseCountMethod,
198    ) -> Result<String, NumberToChineseError> {
199        (self as i128).to_chinese(chinese_variant, chinese_case, method)
200    }
201
202    #[inline]
203    fn to_chinese_naive(
204        self,
205        chinese_variant: ChineseVariant,
206        chinese_case: ChineseCase,
207    ) -> String {
208        from_i64_to_chinese_naive(chinese_variant, chinese_case, self)
209    }
210}
211
212impl NumberToChinese for u128 {
213    #[inline]
214    fn to_chinese(
215        self,
216        chinese_variant: ChineseVariant,
217        chinese_case: ChineseCase,
218        method: ChineseCountMethod,
219    ) -> Result<String, NumberToChineseError> {
220        match method {
221            ChineseCountMethod::Low => {
222                from_u128_to_chinese_low(chinese_variant, chinese_case, self)
223            },
224            ChineseCountMethod::TenThousand => {
225                Ok(from_u128_to_chinese_ten_thousand(chinese_variant, chinese_case, self))
226            },
227            ChineseCountMethod::Middle => {
228                Ok(from_u128_to_chinese_middle(chinese_variant, chinese_case, self))
229            },
230            ChineseCountMethod::High => {
231                Ok(from_u128_to_chinese_high(chinese_variant, chinese_case, self))
232            },
233        }
234    }
235
236    #[inline]
237    fn to_chinese_naive(
238        self,
239        chinese_variant: ChineseVariant,
240        chinese_case: ChineseCase,
241    ) -> String {
242        from_u128_to_chinese_naive(chinese_variant, chinese_case, self)
243    }
244}
245
246impl NumberToChinese for i128 {
247    #[inline]
248    fn to_chinese(
249        self,
250        chinese_variant: ChineseVariant,
251        chinese_case: ChineseCase,
252        method: ChineseCountMethod,
253    ) -> Result<String, NumberToChineseError> {
254        match method {
255            ChineseCountMethod::Low => {
256                from_i128_to_chinese_low(chinese_variant, chinese_case, self)
257            },
258            ChineseCountMethod::TenThousand => {
259                Ok(from_i128_to_chinese_ten_thousand(chinese_variant, chinese_case, self))
260            },
261            ChineseCountMethod::Middle => {
262                Ok(from_i128_to_chinese_middle(chinese_variant, chinese_case, self))
263            },
264            ChineseCountMethod::High => {
265                Ok(from_i128_to_chinese_high(chinese_variant, chinese_case, self))
266            },
267        }
268    }
269
270    #[inline]
271    fn to_chinese_naive(
272        self,
273        chinese_variant: ChineseVariant,
274        chinese_case: ChineseCase,
275    ) -> String {
276        from_i128_to_chinese_naive(chinese_variant, chinese_case, self)
277    }
278}
279
280impl NumberToChinese for f32 {
281    #[inline]
282    fn to_chinese(
283        self,
284        chinese_variant: ChineseVariant,
285        chinese_case: ChineseCase,
286        method: ChineseCountMethod,
287    ) -> Result<String, NumberToChineseError> {
288        (self as f64).to_chinese(chinese_variant, chinese_case, method)
289    }
290
291    #[inline]
292    fn to_chinese_naive(
293        self,
294        chinese_variant: ChineseVariant,
295        chinese_case: ChineseCase,
296    ) -> String {
297        from_f32_to_chinese_naive(chinese_variant, chinese_case, self)
298    }
299}
300
301impl NumberToChinese for f64 {
302    #[inline]
303    fn to_chinese(
304        self,
305        chinese_variant: ChineseVariant,
306        chinese_case: ChineseCase,
307        method: ChineseCountMethod,
308    ) -> Result<String, NumberToChineseError> {
309        match method {
310            ChineseCountMethod::Low => from_f64_to_chinese_low(chinese_variant, chinese_case, self),
311            ChineseCountMethod::TenThousand => {
312                from_f64_to_chinese_ten_thousand(chinese_variant, chinese_case, self)
313            },
314            ChineseCountMethod::Middle => {
315                from_f64_to_chinese_middle(chinese_variant, chinese_case, self)
316            },
317            ChineseCountMethod::High => {
318                Ok(from_f64_to_chinese_high(chinese_variant, chinese_case, self))
319            },
320        }
321    }
322
323    #[inline]
324    fn to_chinese_naive(
325        self,
326        chinese_variant: ChineseVariant,
327        chinese_case: ChineseCase,
328    ) -> String {
329        from_f64_to_chinese_naive(chinese_variant, chinese_case, self)
330    }
331}