bigdecimal/
impl_trait_from_str.rs
1use crate::*;
2use stdlib::str::FromStr;
3
4impl FromStr for BigDecimal {
5 type Err = ParseBigDecimalError;
6
7 #[inline]
8 fn from_str(s: &str) -> Result<BigDecimal, ParseBigDecimalError> {
9 BigDecimal::from_str_radix(s, 10)
11 }
12}
13
14
15#[cfg(test)]
16mod tests {
17 use super::*;
18
19 macro_rules! impl_case {
20 ($name:ident: $input:literal => $int:literal E $exp:literal) => {
21 #[test]
22 fn $name() {
23 let dec = BigDecimal::from_str($input).unwrap();
24 assert_eq!(dec.int_val, $int.into());
25 assert_eq!(dec.scale, -($exp));
26 }
27 };
28 }
29
30 impl_case!(case_1331d107: "1331.107" => 1331107 E -3 );
31 impl_case!(case_1d0: "1.0" => 10 E -1 );
32 impl_case!(case_2e1: "2e1" => 2 E 1 );
33 impl_case!(case_0d00123: "0.00123" => 123 E -5);
34 impl_case!(case_n123: "-123" => -123 E -0);
35 impl_case!(case_n1230: "-1230" => -1230 E -0);
36 impl_case!(case_12d3: "12.3" => 123 E -1);
37 impl_case!(case_123en1: "123e-1" => 123 E -1);
38 impl_case!(case_1d23ep1: "1.23e+1" => 123 E -1);
39 impl_case!(case_1d23ep3: "1.23E+3" => 123 E 1);
40 impl_case!(case_1d23en8: "1.23E-8" => 123 E -10);
41 impl_case!(case_n1d23en10: "-1.23E-10" => -123 E -12);
42 impl_case!(case_123_: "123_" => 123 E -0);
43 impl_case!(case_31_862_140d830_686_979: "31_862_140.830_686_979" => 31862140830686979i128 E -9);
44 impl_case!(case_n1_1d2_2: "-1_1.2_2" => -1122 E -2);
45 impl_case!(case_999d521_939: "999.521_939" => 999521939 E -6);
46 impl_case!(case_679d35_84_03en2: "679.35_84_03E-2" => 679358403 E -8);
47 impl_case!(case_271576662d_e4: "271576662.__E4" => 271576662 E 4);
48
49 impl_case!(case_1_d_2: "1_._2" => 12 E -1);
50}
51
52
53#[cfg(test)]
54mod test_invalid {
55 use super::*;
56
57 macro_rules! impl_case {
58 ($name:ident: $input:literal => $exp:literal) => {
59 #[test]
60 #[should_panic(expected = $exp)]
61 fn $name() {
62 BigDecimal::from_str($input).unwrap();
63 }
64 };
65 }
66
67 impl_case!(case_bad_string_empty : "" => "Empty");
68 impl_case!(case_bad_string_empty_exponent : "123.123E" => "Empty");
69 impl_case!(case_bad_string_only_decimal_point : "." => "Empty");
70 impl_case!(test_bad_string_only_decimal_and_exponent : ".e4" => "Empty");
71
72 impl_case!(test_bad_string_only_decimal_and_underscore : "_._" => "InvalidDigit");
73
74 impl_case!(case_bad_string_hello : "hello" => "InvalidDigit");
75 impl_case!(case_bad_string_nan : "nan" => "InvalidDigit");
76 impl_case!(case_bad_string_invalid_char : "12z3.12" => "InvalidDigit");
77 impl_case!(case_bad_string_nan_exponent : "123.123eg" => "InvalidDigit");
78 impl_case!(case_bad_string_multiple_decimal_points : "123.12.45" => "InvalidDigit");
79 impl_case!(case_bad_string_hex : "0xCafeBeef" => "InvalidDigit");
80}