Skip to main content

codex_protocol/
num_format.rs

1use 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
25/// Format an i64 with locale-aware digit separators (e.g. "12345" -> "12,345"
26/// for en-US).
27pub fn format_with_separators(n: i64) -> String {
28    formatter().format(&Decimal::from(n)).to_string()
29}