From 241e2291bd0f3f1b17b2de39ba3aa67e59a444f7 Mon Sep 17 00:00:00 2001 From: Nicolas Boichat Date: Fri, 7 Mar 2025 10:21:27 +0100 Subject: [PATCH] uucore: format: extendedbigdecimal: Implement From Allows easier conversion. --- .../lib/features/format/extendedbigdecimal.rs | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/uucore/src/lib/features/format/extendedbigdecimal.rs b/src/uucore/src/lib/features/format/extendedbigdecimal.rs index 2938f71df..4e4a1fe5c 100644 --- a/src/uucore/src/lib/features/format/extendedbigdecimal.rs +++ b/src/uucore/src/lib/features/format/extendedbigdecimal.rs @@ -25,6 +25,7 @@ use std::fmt::Display; use std::ops::Add; use bigdecimal::BigDecimal; +use num_traits::FromPrimitive; use num_traits::Zero; #[derive(Debug, Clone)] @@ -76,6 +77,28 @@ pub enum ExtendedBigDecimal { MinusNan, } +impl From for ExtendedBigDecimal { + fn from(val: f64) -> Self { + if val.is_nan() { + if val.is_sign_negative() { + ExtendedBigDecimal::MinusNan + } else { + ExtendedBigDecimal::Nan + } + } else if val.is_infinite() { + if val.is_sign_negative() { + ExtendedBigDecimal::MinusInfinity + } else { + ExtendedBigDecimal::Infinity + } + } else if val.is_zero() && val.is_sign_negative() { + ExtendedBigDecimal::MinusZero + } else { + ExtendedBigDecimal::BigDecimal(BigDecimal::from_f64(val).unwrap()) + } + } +} + impl ExtendedBigDecimal { pub fn zero() -> Self { Self::BigDecimal(0.into())