From 753f77b950e16c712c1cf39ccf18ab7d6a3593e3 Mon Sep 17 00:00:00 2001 From: JasperDeSutter Date: Thu, 15 Dec 2022 11:06:01 +0100 Subject: [PATCH] handle minimum_integer_digits and maximum_significant_digits --- fluent-bundle/src/types/number.rs | 12 ++++++++++-- fluent-bundle/tests/types_test.rs | 22 ++++++++++++++++++++-- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/fluent-bundle/src/types/number.rs b/fluent-bundle/src/types/number.rs index 34efccd1..bf6e18af 100644 --- a/fluent-bundle/src/types/number.rs +++ b/fluent-bundle/src/types/number.rs @@ -167,12 +167,20 @@ impl FluentNumber { } fn as_fixed_decimal(&self) -> FixedDecimal { - let mut fixed_decimal = - FixedDecimal::try_from_f64(self.value, DoublePrecision::Floating).unwrap(); + let precision = if let Some(maxsd) = self.options.maximum_significant_digits { + DoublePrecision::SignificantDigits(maxsd as u8) + } else { + DoublePrecision::Floating + }; + + let mut fixed_decimal = FixedDecimal::try_from_f64(self.value, precision).unwrap(); if let Some(minfd) = self.options.minimum_fraction_digits { fixed_decimal.pad_end(-(minfd as i16)); } + if let Some(minid) = self.options.minimum_integer_digits { + fixed_decimal.pad_start(minid as i16); + } fixed_decimal } diff --git a/fluent-bundle/tests/types_test.rs b/fluent-bundle/tests/types_test.rs index 5b743118..68de567b 100644 --- a/fluent-bundle/tests/types_test.rs +++ b/fluent-bundle/tests/types_test.rs @@ -126,7 +126,7 @@ fn fluent_number_style() { let num = FluentNumber::new(0.2, FluentNumberOptions::default()); assert_eq!(num.as_string_basic(), "0.2"); - let opts = FluentNumberOptions { + let mut opts = FluentNumberOptions { minimum_fraction_digits: Some(3), ..Default::default() }; @@ -134,8 +134,26 @@ fn fluent_number_style() { let num = FluentNumber::new(0.2, opts.clone()); assert_eq!(num.as_string_basic(), "0.200"); - let num = FluentNumber::new(2.0, opts); + let num = FluentNumber::new(2.0, opts.clone()); assert_eq!(num.as_string_basic(), "2.000"); + + opts.minimum_integer_digits = Some(3); + opts.minimum_fraction_digits = None; + + let num = FluentNumber::new(2.0, opts.clone()); + assert_eq!(num.as_string_basic(), "002"); + + let num = FluentNumber::new(0.2, opts.clone()); + assert_eq!(num.as_string_basic(), "000.2"); + + opts.minimum_integer_digits = None; + opts.maximum_significant_digits = Some(4); + + let num = FluentNumber::new(12345.0, opts.clone()); + assert_eq!(num.as_string_basic(), "12340"); + + let num = FluentNumber::new(1.2345, opts); + assert_eq!(num.as_string_basic(), "1.234"); } #[test]