diff --git a/fluent-bundle/Cargo.toml b/fluent-bundle/Cargo.toml index d180db33..3a2e92ae 100644 --- a/fluent-bundle/Cargo.toml +++ b/fluent-bundle/Cargo.toml @@ -42,6 +42,7 @@ smallvec = "1" [dev-dependencies] criterion.workspace = true iai.workspace = true +icu_testdata = "1" serde = { workspace = true, features = ["derive"]} unic-langid = { workspace = true, features = ["macros"] } rand = "0.8" diff --git a/fluent-bundle/src/bundle.rs b/fluent-bundle/src/bundle.rs index 11d9b27d..f0b13a05 100644 --- a/fluent-bundle/src/bundle.rs +++ b/fluent-bundle/src/bundle.rs @@ -549,6 +549,10 @@ impl FluentBundle { }), } } + + pub fn set_number_format_provider(&mut self, provider: NumberFormatProvider) { + self.number_format_provider = Some(provider); + } } impl Default for FluentBundle { diff --git a/fluent-bundle/tests/types_test.rs b/fluent-bundle/tests/types_test.rs index e77981b4..5b743118 100644 --- a/fluent-bundle/tests/types_test.rs +++ b/fluent-bundle/tests/types_test.rs @@ -1,6 +1,7 @@ use fluent_bundle::resolver::Scope; use fluent_bundle::types::{ - FluentNumber, FluentNumberCurrencyDisplayStyle, FluentNumberOptions, FluentNumberStyle, FluentNumberUseGrouping, + FluentNumber, FluentNumberCurrencyDisplayStyle, FluentNumberOptions, FluentNumberStyle, + FluentNumberUseGrouping, }; use fluent_bundle::FluentArgs; use fluent_bundle::FluentBundle; @@ -154,3 +155,24 @@ fn fluent_number_to_operands() { } ); } + +#[test] +fn fluent_number_grouping() { + let langid_ars = langid!("ccp"); + let mut bundle: FluentBundle = FluentBundle::new(vec![langid_ars]); + bundle.set_number_format_provider(Box::new(icu_testdata::unstable_no_fallback())); + + let mut number = FluentNumber::from(1234567890.1234567); + + number.options.use_grouping = FluentNumberUseGrouping::False; + let no_grouping = number.as_string(&bundle); + assert_eq!(no_grouping, "π‘„·π‘„Έπ‘„Ήπ‘„Ίπ‘„»π‘„Όπ‘„½π‘„Ύπ‘„Ώπ‘„Ά.π‘„·π‘„Έπ‘„Ήπ‘„Ίπ‘„»π‘„Όπ‘„½"); + + number.options.use_grouping = FluentNumberUseGrouping::Min2; + let long = number.as_string(&bundle); + assert_eq!(long, "π‘„·,π‘„Έπ‘„Ή,π‘„Ίπ‘„»,π‘„Όπ‘„½,π‘„Ύπ‘„Ώπ‘„Ά.π‘„·π‘„Έπ‘„Ήπ‘„Ίπ‘„»π‘„Όπ‘„½"); + + number.value = -1234.0; + let short = number.as_string(&bundle); + assert_eq!(short, "-π‘„·π‘„Έπ‘„Ήπ‘„Ί"); +}