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        // implemented in impl_num.rs
10        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}