Skip to content

Commit 29601c8

Browse files
committed
seq:update the digit counting
1 parent a1315b3 commit 29601c8

File tree

1 file changed

+33
-5
lines changed

1 file changed

+33
-5
lines changed

src/uu/seq/src/floatparse.rs

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,13 @@ pub fn parse_hexadecimal_float(s: &str) -> Result<PreciseNumber, ParseNumberErro
5656

5757
// Build a PreciseNumber
5858
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 };
6062
Ok(PreciseNumber::new(
6163
ExtendedBigDecimal::BigDecimal(number),
62-
0,
63-
fractional_digits,
64+
integral_digits as usize,
65+
fractional_digits as usize,
6466
))
6567
}
6668

@@ -159,15 +161,22 @@ mod tests {
159161

160162
use super::parse_hexadecimal_float;
161163
use crate::{numberparse::ParseNumberError, ExtendedBigDecimal};
164+
use bigdecimal::BigDecimal;
162165
use num_traits::ToPrimitive;
163166

164-
fn parse_f64(s: &str) -> Result<f64, ParseNumberError> {
167+
fn parse_big_decimal(s: &str) -> Result<BigDecimal, ParseNumberError> {
165168
match parse_hexadecimal_float(s)?.number {
166-
ExtendedBigDecimal::BigDecimal(bd) => bd.to_f64().ok_or(ParseNumberError::Float),
169+
ExtendedBigDecimal::BigDecimal(bd) => Ok(bd),
167170
_ => Err(ParseNumberError::Float),
168171
}
169172
}
170173

174+
fn parse_f64(s: &str) -> Result<f64, ParseNumberError> {
175+
parse_big_decimal(s)?
176+
.to_f64()
177+
.ok_or(ParseNumberError::Float)
178+
}
179+
171180
#[test]
172181
fn test_parse_precise_number_case_insensitive() {
173182
assert_eq!(parse_f64("0x1P1").unwrap(), 2.0);
@@ -244,4 +253,23 @@ mod tests {
244253
assert_eq!(parse_f64("0x1.8p2z").unwrap_err(), expected_error);
245254
assert_eq!(parse_f64("0x1p3.2").unwrap_err(), expected_error);
246255
}
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+
}
247275
}

0 commit comments

Comments
 (0)