chinese_number/number_to_chinese/
mod.rs

1mod functions;
2mod naive;
3mod number_to_chinese_error;
4mod traits;
5
6mod functions_test;
7
8use alloc::string::String;
9
10use functions::*;
11pub use naive::*;
12pub use number_to_chinese_error::*;
13pub use traits::*;
14
15use crate::{ChineseCase, ChineseCountMethod, ChineseSign, ChineseVariant};
16
17// TODO unsigned integer
18
19/// 將 `u8` 整數轉成中文數字。
20#[inline]
21pub fn from_u8_to_chinese(
22    chinese_variant: ChineseVariant,
23    chinese_case: ChineseCase,
24    value: u8,
25) -> String {
26    from_u128_to_chinese_low(chinese_variant, chinese_case, value as u128).unwrap()
27}
28
29/// 將 `u16` 整數轉成中文數字。
30#[inline]
31pub fn from_u16_to_chinese(
32    chinese_variant: ChineseVariant,
33    chinese_case: ChineseCase,
34    value: u16,
35) -> String {
36    from_u128_to_chinese_low(chinese_variant, chinese_case, value as u128).unwrap()
37}
38
39/// 將 `u32` 整數轉成中文數字,使用 **「下數」**。
40#[inline]
41pub fn from_u32_to_chinese_low(
42    chinese_variant: ChineseVariant,
43    chinese_case: ChineseCase,
44    value: u32,
45) -> String {
46    from_u128_to_chinese_low(chinese_variant, chinese_case, value as u128).unwrap()
47}
48
49/// 將 `u32` 整數轉成中文數字,使用 **「萬進」**。
50#[inline]
51pub fn from_u32_to_chinese_ten_thousand(
52    chinese_variant: ChineseVariant,
53    chinese_case: ChineseCase,
54    value: u32,
55) -> String {
56    from_u128_to_chinese_ten_thousand(chinese_variant, chinese_case, value as u128)
57}
58
59/// 將 `u32` 整數轉成中文數字,使用 **「中數」**。
60#[inline]
61pub fn from_u32_to_chinese_middle(
62    chinese_variant: ChineseVariant,
63    chinese_case: ChineseCase,
64    value: u32,
65) -> String {
66    from_u128_to_chinese_middle(chinese_variant, chinese_case, value as u128)
67}
68
69/// 將 `u32` 整數轉成中文數字,使用 **「上數」**。
70#[inline]
71pub fn from_u32_to_chinese_high(
72    chinese_variant: ChineseVariant,
73    chinese_case: ChineseCase,
74    value: u32,
75) -> String {
76    from_u128_to_chinese_high(chinese_variant, chinese_case, value as u128)
77}
78
79/// 將 `u64` 整數轉成中文數字,使用 **「下數」**。數值不能大於或等於 `1_0000_0000_0000_0000`。
80#[inline]
81pub fn from_u64_to_chinese_low(
82    chinese_variant: ChineseVariant,
83    chinese_case: ChineseCase,
84    value: u64,
85) -> Result<String, NumberToChineseError> {
86    from_u128_to_chinese_low(chinese_variant, chinese_case, value as u128)
87}
88
89/// 將 `u64` 整數轉成中文數字,使用 **「萬進」**。
90#[inline]
91pub fn from_u64_to_chinese_ten_thousand(
92    chinese_variant: ChineseVariant,
93    chinese_case: ChineseCase,
94    value: u64,
95) -> String {
96    from_u128_to_chinese_ten_thousand(chinese_variant, chinese_case, value as u128)
97}
98
99/// 將 `u64` 整數轉成中文數字,使用 **「中數」**。
100#[inline]
101pub fn from_u64_to_chinese_middle(
102    chinese_variant: ChineseVariant,
103    chinese_case: ChineseCase,
104    value: u64,
105) -> String {
106    from_u128_to_chinese_middle(chinese_variant, chinese_case, value as u128)
107}
108
109/// 將 `u64` 整數轉成中文數字,使用 **「上數」**。
110#[inline]
111pub fn from_u64_to_chinese_high(
112    chinese_variant: ChineseVariant,
113    chinese_case: ChineseCase,
114    value: u64,
115) -> String {
116    from_u128_to_chinese_high(chinese_variant, chinese_case, value as u128)
117}
118
119/// 將 `u128` 整數轉成中文數字,使用 **「下數」**。數值不能大於或等於 `1_0000_0000_0000_0000`。
120#[inline]
121pub fn from_u128_to_chinese_low(
122    chinese_variant: ChineseVariant,
123    chinese_case: ChineseCase,
124    value: u128,
125) -> Result<String, NumberToChineseError> {
126    if value >= 1_0000_0000_0000_0000 {
127        return Err(NumberToChineseError::Overflow);
128    }
129
130    Ok(unsigned_integer_to_chinese_low(chinese_variant, chinese_case, false, value))
131}
132
133/// 將 `u128` 整數轉成中文數字,使用 **「萬進」**。
134#[inline]
135pub fn from_u128_to_chinese_ten_thousand(
136    chinese_variant: ChineseVariant,
137    chinese_case: ChineseCase,
138    value: u128,
139) -> String {
140    unsigned_integer_to_chinese_ten_thousand(chinese_variant, chinese_case, false, value)
141}
142
143/// 將 `u128` 整數轉成中文數字,使用 **「中數」**。
144#[inline]
145pub fn from_u128_to_chinese_middle(
146    chinese_variant: ChineseVariant,
147    chinese_case: ChineseCase,
148    value: u128,
149) -> String {
150    unsigned_integer_to_chinese_middle(chinese_variant, chinese_case, false, value)
151}
152
153/// 將 `u128` 整數轉成中文數字,使用 **「上數」**。
154#[inline]
155pub fn from_u128_to_chinese_high(
156    chinese_variant: ChineseVariant,
157    chinese_case: ChineseCase,
158    value: u128,
159) -> String {
160    unsigned_integer_to_chinese_high(chinese_variant, chinese_case, false, value)
161}
162
163/// 將 `usize` 整數轉成中文數字,使用 **「下數」**。數值不能大於或等於 `1_0000_0000_0000_0000`。
164#[inline]
165pub fn from_usize_to_chinese_low(
166    chinese_variant: ChineseVariant,
167    chinese_case: ChineseCase,
168    value: usize,
169) -> Result<String, NumberToChineseError> {
170    from_u128_to_chinese_low(chinese_variant, chinese_case, value as u128)
171}
172
173/// 將 `usize` 整數轉成中文數字,使用 **「萬進」**。
174#[inline]
175pub fn from_usize_to_chinese_ten_thousand(
176    chinese_variant: ChineseVariant,
177    chinese_case: ChineseCase,
178    value: usize,
179) -> String {
180    from_u128_to_chinese_ten_thousand(chinese_variant, chinese_case, value as u128)
181}
182
183/// 將 `usize` 整數轉成中文數字,使用 **「中數」**。
184#[inline]
185pub fn from_usize_to_chinese_middle(
186    chinese_variant: ChineseVariant,
187    chinese_case: ChineseCase,
188    value: usize,
189) -> String {
190    from_u128_to_chinese_middle(chinese_variant, chinese_case, value as u128)
191}
192
193/// 將 `usize` 整數轉成中文數字,使用 **「上數」**。
194#[inline]
195pub fn from_usize_to_chinese_high(
196    chinese_variant: ChineseVariant,
197    chinese_case: ChineseCase,
198    value: usize,
199) -> String {
200    from_u128_to_chinese_high(chinese_variant, chinese_case, value as u128)
201}
202
203// TODO signed integer
204
205/// 將 `i8` 整數轉成中文數字。
206#[inline]
207pub fn from_i8_to_chinese(
208    chinese_variant: ChineseVariant,
209    chinese_case: ChineseCase,
210    value: i8,
211) -> String {
212    from_i128_to_chinese_low(chinese_variant, chinese_case, value as i128).unwrap()
213}
214
215/// 將 `i16` 整數轉成中文數字。
216#[inline]
217pub fn from_i16_to_chinese(
218    chinese_variant: ChineseVariant,
219    chinese_case: ChineseCase,
220    value: i16,
221) -> String {
222    from_i128_to_chinese_low(chinese_variant, chinese_case, value as i128).unwrap()
223}
224
225/// 將 `i32` 整數轉成中文數字,使用 **「下數」**。
226#[inline]
227pub fn from_i32_to_chinese_low(
228    chinese_variant: ChineseVariant,
229    chinese_case: ChineseCase,
230    value: i32,
231) -> String {
232    from_i128_to_chinese_low(chinese_variant, chinese_case, value as i128).unwrap()
233}
234
235/// 將 `i32` 整數轉成中文數字,使用 **「萬進」**。
236#[inline]
237pub fn from_i32_to_chinese_ten_thousand(
238    chinese_variant: ChineseVariant,
239    chinese_case: ChineseCase,
240    value: i32,
241) -> String {
242    from_i128_to_chinese_ten_thousand(chinese_variant, chinese_case, value as i128)
243}
244
245/// 將 `i32` 整數轉成中文數字,使用 **「中數」**。
246#[inline]
247pub fn from_i32_to_chinese_middle(
248    chinese_variant: ChineseVariant,
249    chinese_case: ChineseCase,
250    value: i32,
251) -> String {
252    from_i128_to_chinese_middle(chinese_variant, chinese_case, value as i128)
253}
254
255/// 將 `i32` 整數轉成中文數字,使用 **「上數」**。
256#[inline]
257pub fn from_i32_to_chinese_high(
258    chinese_variant: ChineseVariant,
259    chinese_case: ChineseCase,
260    value: i32,
261) -> String {
262    from_i128_to_chinese_high(chinese_variant, chinese_case, value as i128)
263}
264
265/// 將 `i64` 整數轉成中文數字,使用 **「下數」**。數值的絕對值不能大於或等於 `1_0000_0000_0000_0000`。
266#[inline]
267pub fn from_i64_to_chinese_low(
268    chinese_variant: ChineseVariant,
269    chinese_case: ChineseCase,
270    value: i64,
271) -> Result<String, NumberToChineseError> {
272    from_i128_to_chinese_low(chinese_variant, chinese_case, value as i128)
273}
274
275/// 將 `i64` 整數轉成中文數字,使用 **「萬進」**。
276#[inline]
277pub fn from_i64_to_chinese_ten_thousand(
278    chinese_variant: ChineseVariant,
279    chinese_case: ChineseCase,
280    value: i64,
281) -> String {
282    from_i128_to_chinese_ten_thousand(chinese_variant, chinese_case, value as i128)
283}
284
285/// 將 `i64` 整數轉成中文數字,使用 **「中數」**。
286#[inline]
287pub fn from_i64_to_chinese_middle(
288    chinese_variant: ChineseVariant,
289    chinese_case: ChineseCase,
290    value: i64,
291) -> String {
292    from_i128_to_chinese_middle(chinese_variant, chinese_case, value as i128)
293}
294
295/// 將 `i64` 整數轉成中文數字,使用 **「上數」**。
296#[inline]
297pub fn from_i64_to_chinese_high(
298    chinese_variant: ChineseVariant,
299    chinese_case: ChineseCase,
300    value: i64,
301) -> String {
302    from_i128_to_chinese_high(chinese_variant, chinese_case, value as i128)
303}
304
305/// 將 `i128` 整數轉成中文數字,使用 **「下數」**。數值的絕對值不能大於或等於 `1_0000_0000_0000_0000`。
306#[inline]
307pub fn from_i128_to_chinese_low(
308    chinese_variant: ChineseVariant,
309    chinese_case: ChineseCase,
310    value: i128,
311) -> Result<String, NumberToChineseError> {
312    if value < 0 {
313        let mut s =
314            from_u128_to_chinese_low(chinese_variant, chinese_case, -(value + 1) as u128 + 1)
315                .map_err(|err| match err {
316                    NumberToChineseError::Overflow => NumberToChineseError::Underflow,
317                    _ => err,
318                })?;
319
320        s.insert_str(0, ChineseSign::負.to_str(chinese_variant));
321
322        Ok(s)
323    } else {
324        from_u128_to_chinese_low(chinese_variant, chinese_case, value as u128)
325    }
326}
327
328/// 將 `i128` 整數轉成中文數字,使用 **「萬進」**。
329#[inline]
330pub fn from_i128_to_chinese_ten_thousand(
331    chinese_variant: ChineseVariant,
332    chinese_case: ChineseCase,
333    value: i128,
334) -> String {
335    if value < 0 {
336        let mut s = from_u128_to_chinese_ten_thousand(
337            chinese_variant,
338            chinese_case,
339            -(value + 1) as u128 + 1,
340        );
341
342        s.insert_str(0, ChineseSign::負.to_str(chinese_variant));
343
344        s
345    } else {
346        from_u128_to_chinese_ten_thousand(chinese_variant, chinese_case, value as u128)
347    }
348}
349
350/// 將 `i128` 整數轉成中文數字,使用 **「中數」**。
351#[inline]
352pub fn from_i128_to_chinese_middle(
353    chinese_variant: ChineseVariant,
354    chinese_case: ChineseCase,
355    value: i128,
356) -> String {
357    if value < 0 {
358        let mut s =
359            from_u128_to_chinese_middle(chinese_variant, chinese_case, -(value + 1) as u128 + 1);
360
361        s.insert_str(0, ChineseSign::負.to_str(chinese_variant));
362
363        s
364    } else {
365        from_u128_to_chinese_middle(chinese_variant, chinese_case, value as u128)
366    }
367}
368
369/// 將 `i128` 整數轉成中文數字,使用 **「上數」**。
370#[inline]
371pub fn from_i128_to_chinese_high(
372    chinese_variant: ChineseVariant,
373    chinese_case: ChineseCase,
374    value: i128,
375) -> String {
376    if value < 0 {
377        let mut s =
378            from_u128_to_chinese_high(chinese_variant, chinese_case, -(value + 1) as u128 + 1);
379
380        s.insert_str(0, ChineseSign::負.to_str(chinese_variant));
381
382        s
383    } else {
384        from_u128_to_chinese_high(chinese_variant, chinese_case, value as u128)
385    }
386}
387
388/// 將 `isize` 整數轉成中文數字,使用 **「下數」**。數值的絕對值不能大於或等於 `1_0000_0000_0000_0000`。
389#[inline]
390pub fn from_isize_to_chinese_low(
391    chinese_variant: ChineseVariant,
392    chinese_case: ChineseCase,
393    value: isize,
394) -> Result<String, NumberToChineseError> {
395    from_i128_to_chinese_low(chinese_variant, chinese_case, value as i128)
396}
397
398/// 將 `isize` 整數轉成中文數字,使用 **「萬進」**。
399#[inline]
400pub fn from_isize_to_chinese_ten_thousand(
401    chinese_variant: ChineseVariant,
402    chinese_case: ChineseCase,
403    value: isize,
404) -> String {
405    from_i128_to_chinese_ten_thousand(chinese_variant, chinese_case, value as i128)
406}
407
408/// 將 `isize` 整數轉成中文數字,使用 **「中數」**。
409#[inline]
410pub fn from_isize_to_chinese_middle(
411    chinese_variant: ChineseVariant,
412    chinese_case: ChineseCase,
413    value: isize,
414) -> String {
415    from_i128_to_chinese_middle(chinese_variant, chinese_case, value as i128)
416}
417
418/// 將 `isize` 整數轉成中文數字,使用 **「上數」**。
419#[inline]
420pub fn from_isize_to_chinese_high(
421    chinese_variant: ChineseVariant,
422    chinese_case: ChineseCase,
423    value: isize,
424) -> String {
425    from_i128_to_chinese_high(chinese_variant, chinese_case, value as i128)
426}
427
428// TODO float
429
430/// 將 `f32` 浮點數轉成中文數字,使用 **「下數」**。數值的絕對值不能大於或等於 `1_0000_0000_0000_0000`。
431#[inline]
432pub fn from_f32_to_chinese_low(
433    chinese_variant: ChineseVariant,
434    chinese_case: ChineseCase,
435    value: f32,
436) -> Result<String, NumberToChineseError> {
437    from_f64_to_chinese_low(chinese_variant, chinese_case, value as f64)
438}
439
440/// 將 `f32` 浮點數轉成中文數字,使用 **「萬進」**。
441#[inline]
442pub fn from_f32_to_chinese_ten_thousand(
443    chinese_variant: ChineseVariant,
444    chinese_case: ChineseCase,
445    value: f32,
446) -> String {
447    from_f64_to_chinese_ten_thousand(chinese_variant, chinese_case, value as f64).unwrap()
448}
449
450/// 將 `f32` 浮點數轉成中文數字,使用 **「中數」**。
451#[inline]
452pub fn from_f32_to_chinese_middle(
453    chinese_variant: ChineseVariant,
454    chinese_case: ChineseCase,
455    value: f32,
456) -> String {
457    from_f64_to_chinese_middle(chinese_variant, chinese_case, value as f64).unwrap()
458}
459
460/// 將 `f32` 浮點數轉成中文數字,使用 **「上數」**。
461#[inline]
462pub fn from_f32_to_chinese_high(
463    chinese_variant: ChineseVariant,
464    chinese_case: ChineseCase,
465    value: f32,
466) -> String {
467    from_f64_to_chinese_high(chinese_variant, chinese_case, value as f64)
468}
469
470#[inline]
471fn from_f64_to_chinese(
472    chinese_variant: ChineseVariant,
473    chinese_case: ChineseCase,
474    method: ChineseCountMethod,
475    value: f64,
476) -> String {
477    if value < 0.0 {
478        let mut s = positive_float_to_chinese(chinese_variant, chinese_case, method, -value);
479
480        s.insert_str(0, ChineseSign::負.to_str(chinese_variant));
481
482        s
483    } else {
484        positive_float_to_chinese(chinese_variant, chinese_case, method, value)
485    }
486}
487
488/// 將 `f64` 浮點數轉成中文數字,使用 **「下數」**。數值的絕對值不能大於或等於 `1_0000_0000_0000_0000`。
489#[inline]
490pub fn from_f64_to_chinese_low(
491    chinese_variant: ChineseVariant,
492    chinese_case: ChineseCase,
493    value: f64,
494) -> Result<String, NumberToChineseError> {
495    if value >= 1_0000_0000_0000_0000f64 {
496        return Err(NumberToChineseError::Overflow);
497    } else if value <= -1_0000_0000_0000_0000f64 {
498        return Err(NumberToChineseError::Underflow);
499    }
500
501    Ok(from_f64_to_chinese(chinese_variant, chinese_case, ChineseCountMethod::Low, value))
502}
503
504/// 將 `f64` 浮點數轉成中文數字,使用 **「萬進」**。數值的絕對值不能大於或等於 `1e52`。
505#[inline]
506pub fn from_f64_to_chinese_ten_thousand(
507    chinese_variant: ChineseVariant,
508    chinese_case: ChineseCase,
509    value: f64,
510) -> Result<String, NumberToChineseError> {
511    if value >= 1e52 {
512        return Err(NumberToChineseError::Overflow);
513    } else if value <= -1e52 {
514        return Err(NumberToChineseError::Underflow);
515    }
516
517    Ok(from_f64_to_chinese(chinese_variant, chinese_case, ChineseCountMethod::TenThousand, value))
518}
519
520/// 將 `f64` 浮點數轉成中文數字,使用 **「中數」**。數值的絕對值不能大於或等於 `1e96`。
521#[inline]
522pub fn from_f64_to_chinese_middle(
523    chinese_variant: ChineseVariant,
524    chinese_case: ChineseCase,
525    value: f64,
526) -> Result<String, NumberToChineseError> {
527    if value >= 1e96 {
528        return Err(NumberToChineseError::Overflow);
529    } else if value <= -1e96 {
530        return Err(NumberToChineseError::Underflow);
531    }
532
533    Ok(from_f64_to_chinese(chinese_variant, chinese_case, ChineseCountMethod::Middle, value))
534}
535
536/// 將 `f64` 浮點數轉成中文數字,使用 **「上數」**。
537#[inline]
538pub fn from_f64_to_chinese_high(
539    chinese_variant: ChineseVariant,
540    chinese_case: ChineseCase,
541    value: f64,
542) -> String {
543    from_f64_to_chinese(chinese_variant, chinese_case, ChineseCountMethod::High, value)
544}