@@ -56,11 +56,13 @@ pub fn parse_hexadecimal_float(s: &str) -> Result<PreciseNumber, ParseNumberErro
56
56
57
57
// Build a PreciseNumber
58
58
let number = BigDecimal :: from_f64 ( value) . ok_or ( ParseNumberError :: Float ) ?;
59
- let fractional_digits = i64:: max ( number. fractional_digit_count ( ) , 0 ) as usize ;
59
+ let fractional_digits = i64:: max ( number. fractional_digit_count ( ) , 0 ) ;
60
+ let integral_digits =
61
+ number. digits ( ) - fractional_digits as u64 + if sign < 0.0 { 1 } else { 0 } ;
60
62
Ok ( PreciseNumber :: new (
61
63
ExtendedBigDecimal :: BigDecimal ( number) ,
62
- 0 ,
63
- fractional_digits,
64
+ integral_digits as usize ,
65
+ fractional_digits as usize ,
64
66
) )
65
67
}
66
68
@@ -159,15 +161,22 @@ mod tests {
159
161
160
162
use super :: parse_hexadecimal_float;
161
163
use crate :: { numberparse:: ParseNumberError , ExtendedBigDecimal } ;
164
+ use bigdecimal:: BigDecimal ;
162
165
use num_traits:: ToPrimitive ;
163
166
164
- fn parse_f64 ( s : & str ) -> Result < f64 , ParseNumberError > {
167
+ fn parse_big_decimal ( s : & str ) -> Result < BigDecimal , ParseNumberError > {
165
168
match parse_hexadecimal_float ( s) ?. number {
166
- ExtendedBigDecimal :: BigDecimal ( bd) => bd . to_f64 ( ) . ok_or ( ParseNumberError :: Float ) ,
169
+ ExtendedBigDecimal :: BigDecimal ( bd) => Ok ( bd ) ,
167
170
_ => Err ( ParseNumberError :: Float ) ,
168
171
}
169
172
}
170
173
174
+ fn parse_f64 ( s : & str ) -> Result < f64 , ParseNumberError > {
175
+ parse_big_decimal ( s) ?
176
+ . to_f64 ( )
177
+ . ok_or ( ParseNumberError :: Float )
178
+ }
179
+
171
180
#[ test]
172
181
fn test_parse_precise_number_case_insensitive ( ) {
173
182
assert_eq ! ( parse_f64( "0x1P1" ) . unwrap( ) , 2.0 ) ;
@@ -244,4 +253,23 @@ mod tests {
244
253
assert_eq ! ( parse_f64( "0x1.8p2z" ) . unwrap_err( ) , expected_error) ;
245
254
assert_eq ! ( parse_f64( "0x1p3.2" ) . unwrap_err( ) , expected_error) ;
246
255
}
256
+
257
+ #[ test]
258
+ fn test_parse_precise_number_count_digits ( ) {
259
+ let precise_num = parse_hexadecimal_float ( "0x1.2" ) . unwrap ( ) ; // 1.125 decimal
260
+ assert_eq ! ( precise_num. num_integral_digits, 1 ) ;
261
+ assert_eq ! ( precise_num. num_fractional_digits, 3 ) ;
262
+
263
+ let precise_num = parse_hexadecimal_float ( "-0x1.2" ) . unwrap ( ) ; // -1.125 decimal
264
+ assert_eq ! ( precise_num. num_integral_digits, 2 ) ;
265
+ assert_eq ! ( precise_num. num_fractional_digits, 3 ) ;
266
+
267
+ let precise_num = parse_hexadecimal_float ( "0x123.8" ) . unwrap ( ) ; // 291.5 decimal
268
+ assert_eq ! ( precise_num. num_integral_digits, 3 ) ;
269
+ assert_eq ! ( precise_num. num_fractional_digits, 1 ) ;
270
+
271
+ let precise_num = parse_hexadecimal_float ( "-0x123.8" ) . unwrap ( ) ; // -291.5 decimal
272
+ assert_eq ! ( precise_num. num_integral_digits, 4 ) ;
273
+ assert_eq ! ( precise_num. num_fractional_digits, 1 ) ;
274
+ }
247
275
}
0 commit comments