codex_protocol/
num_format.rs1use std::sync::OnceLock;
2
3use icu_decimal::DecimalFormatter;
4use icu_decimal::input::Decimal;
5use icu_decimal::options::DecimalFormatterOptions;
6use icu_locale_core::Locale;
7
8fn make_local_formatter() -> Option<DecimalFormatter> {
9 let loc: Locale = sys_locale::get_locale()?.parse().ok()?;
10 DecimalFormatter::try_new(loc.into(), DecimalFormatterOptions::default()).ok()
11}
12
13fn make_en_us_formatter() -> DecimalFormatter {
14 #![allow(clippy::expect_used)]
15 let loc: Locale = "en-US".parse().expect("en-US wasn't a valid locale");
16 DecimalFormatter::try_new(loc.into(), DecimalFormatterOptions::default())
17 .expect("en-US wasn't a valid locale")
18}
19
20fn formatter() -> &'static DecimalFormatter {
21 static FORMATTER: OnceLock<DecimalFormatter> = OnceLock::new();
22 FORMATTER.get_or_init(|| make_local_formatter().unwrap_or_else(make_en_us_formatter))
23}
24
25pub fn format_with_separators(n: i64) -> String {
28 formatter().format(&Decimal::from(n)).to_string()
29}