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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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#[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}