Skip to content

Commit 1564a02

Browse files
handle minimum_integer_digits and maximum_significant_digits
1 parent 435bf1e commit 1564a02

File tree

2 files changed

+30
-4
lines changed

2 files changed

+30
-4
lines changed

fluent-bundle/src/types/number.rs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -178,12 +178,20 @@ impl FluentNumber {
178178
}
179179

180180
fn as_fixed_decimal(&self) -> FixedDecimal {
181-
let mut fixed_decimal =
182-
FixedDecimal::try_from_f64(self.value, DoublePrecision::Floating).unwrap();
181+
let precision = if let Some(maxsd) = self.options.maximum_significant_digits {
182+
DoublePrecision::SignificantDigits(maxsd as u8)
183+
} else {
184+
DoublePrecision::Floating
185+
};
186+
187+
let mut fixed_decimal = FixedDecimal::try_from_f64(self.value, precision).unwrap();
183188

184189
if let Some(minfd) = self.options.minimum_fraction_digits {
185190
fixed_decimal.pad_end(-(minfd as i16));
186191
}
192+
if let Some(minid) = self.options.minimum_integer_digits {
193+
fixed_decimal.pad_start(minid as i16);
194+
}
187195
fixed_decimal
188196
}
189197

fluent-bundle/tests/types_test.rs

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,16 +126,34 @@ fn fluent_number_style() {
126126
let num = FluentNumber::new(0.2, FluentNumberOptions::default());
127127
assert_eq!(num.as_string_basic(), "0.2");
128128

129-
let opts = FluentNumberOptions {
129+
let mut opts = FluentNumberOptions {
130130
minimum_fraction_digits: Some(3),
131131
..Default::default()
132132
};
133133

134134
let num = FluentNumber::new(0.2, opts.clone());
135135
assert_eq!(num.as_string_basic(), "0.200");
136136

137-
let num = FluentNumber::new(2.0, opts);
137+
let num = FluentNumber::new(2.0, opts.clone());
138138
assert_eq!(num.as_string_basic(), "2.000");
139+
140+
opts.minimum_integer_digits = Some(3);
141+
opts.minimum_fraction_digits = None;
142+
143+
let num = FluentNumber::new(2.0, opts.clone());
144+
assert_eq!(num.as_string_basic(), "002");
145+
146+
let num = FluentNumber::new(0.2, opts.clone());
147+
assert_eq!(num.as_string_basic(), "000.2");
148+
149+
opts.minimum_integer_digits = None;
150+
opts.maximum_significant_digits = Some(4);
151+
152+
let num = FluentNumber::new(12345.0, opts.clone());
153+
assert_eq!(num.as_string_basic(), "12340");
154+
155+
let num = FluentNumber::new(1.2345, opts);
156+
assert_eq!(num.as_string_basic(), "1.234");
139157
}
140158

141159
#[test]

0 commit comments

Comments
 (0)