1
Fork 0
mirror of https://github.com/RGBCube/uutils-coreutils synced 2025-07-29 03:57:44 +00:00

Merge pull request #6185 from maxer137/main

seq: Removed zero-padding of string when parsing with parse_exponent_no_decimal
This commit is contained in:
Sylvestre Ledru 2024-04-08 09:14:42 +02:00 committed by GitHub
commit aeafabd23f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -103,8 +103,13 @@ fn parse_exponent_no_decimal(s: &str, j: usize) -> Result<PreciseNumber, ParseNu
// displayed as "0.01", but "1e2" will be displayed as "100", // displayed as "0.01", but "1e2" will be displayed as "100",
// without a decimal point. // without a decimal point.
let x: BigDecimal = s.parse().map_err(|_| ParseNumberError::Float)?; let x: BigDecimal = s.parse().map_err(|_| ParseNumberError::Float)?;
let num_integral_digits = if is_minus_zero_float(s, &x) { let num_integral_digits = if is_minus_zero_float(s, &x) {
2 if exponent > 0 {
2usize + exponent as usize
} else {
2usize
}
} else { } else {
let total = j as i64 + exponent; let total = j as i64 + exponent;
let result = if total < 1 { let result = if total < 1 {
@ -120,24 +125,18 @@ fn parse_exponent_no_decimal(s: &str, j: usize) -> Result<PreciseNumber, ParseNu
}; };
let num_fractional_digits = if exponent < 0 { -exponent as usize } else { 0 }; let num_fractional_digits = if exponent < 0 { -exponent as usize } else { 0 };
if exponent < 0 { if is_minus_zero_float(s, &x) {
if is_minus_zero_float(s, &x) { Ok(PreciseNumber::new(
Ok(PreciseNumber::new( ExtendedBigDecimal::MinusZero,
ExtendedBigDecimal::MinusZero, num_integral_digits,
num_integral_digits, num_fractional_digits,
num_fractional_digits, ))
))
} else {
Ok(PreciseNumber::new(
ExtendedBigDecimal::BigDecimal(x),
num_integral_digits,
num_fractional_digits,
))
}
} else { } else {
let zeros = "0".repeat(exponent.try_into().unwrap()); Ok(PreciseNumber::new(
let expanded = [&s[0..j], &zeros].concat(); ExtendedBigDecimal::BigDecimal(x),
parse_no_decimal_no_exponent(&expanded) num_integral_digits,
num_fractional_digits,
))
} }
} }
@ -207,7 +206,11 @@ fn parse_decimal_and_exponent(
let minimum: usize = { let minimum: usize = {
let integral_part: f64 = s[..j].parse().map_err(|_| ParseNumberError::Float)?; let integral_part: f64 = s[..j].parse().map_err(|_| ParseNumberError::Float)?;
if integral_part.is_sign_negative() { if integral_part.is_sign_negative() {
2 if exponent > 0 {
2usize + exponent as usize
} else {
2usize
}
} else { } else {
1 1
} }
@ -234,30 +237,7 @@ fn parse_decimal_and_exponent(
.unwrap() .unwrap()
}; };
if num_digits_between_decimal_point_and_e <= exponent { if is_minus_zero_float(s, &val) {
if is_minus_zero_float(s, &val) {
Ok(PreciseNumber::new(
ExtendedBigDecimal::MinusZero,
num_integral_digits,
num_fractional_digits,
))
} else {
let zeros: String = "0".repeat(
(exponent - num_digits_between_decimal_point_and_e)
.try_into()
.unwrap(),
);
let expanded = [&s[0..i], &s[i + 1..j], &zeros].concat();
let n = expanded
.parse::<BigDecimal>()
.map_err(|_| ParseNumberError::Float)?;
Ok(PreciseNumber::new(
ExtendedBigDecimal::BigDecimal(n),
num_integral_digits,
num_fractional_digits,
))
}
} else if is_minus_zero_float(s, &val) {
Ok(PreciseNumber::new( Ok(PreciseNumber::new(
ExtendedBigDecimal::MinusZero, ExtendedBigDecimal::MinusZero,
num_integral_digits, num_integral_digits,