Skip to content

Commit 753f77b

Browse files
handle minimum_integer_digits and maximum_significant_digits
1 parent b2301d3 commit 753f77b

File tree

2 files changed

+30
-4
lines changed

2 files changed

+30
-4
lines changed

fluent-bundle/src/types/number.rs

+10-2
Original file line numberDiff line numberDiff line change
@@ -167,12 +167,20 @@ impl FluentNumber {
167167
}
168168

169169
fn as_fixed_decimal(&self) -> FixedDecimal {
170-
let mut fixed_decimal =
171-
FixedDecimal::try_from_f64(self.value, DoublePrecision::Floating).unwrap();
170+
let precision = if let Some(maxsd) = self.options.maximum_significant_digits {
171+
DoublePrecision::SignificantDigits(maxsd as u8)
172+
} else {
173+
DoublePrecision::Floating
174+
};
175+
176+
let mut fixed_decimal = FixedDecimal::try_from_f64(self.value, precision).unwrap();
172177

173178
if let Some(minfd) = self.options.minimum_fraction_digits {
174179
fixed_decimal.pad_end(-(minfd as i16));
175180
}
181+
if let Some(minid) = self.options.minimum_integer_digits {
182+
fixed_decimal.pad_start(minid as i16);
183+
}
176184
fixed_decimal
177185
}
178186

fluent-bundle/tests/types_test.rs

+20-2
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)