From 9412d3ccaf13936093be6afc5e38daa205d6f8cc Mon Sep 17 00:00:00 2001 From: NetterSilver <133535268+Silvertree2010@users.noreply.github.com> Date: Mon, 19 Oct 2026 12:09:27 +0000 Subject: [PATCH] Format General scientific notation like Excel (1.5E+12) Found while testing crates/model/src/numfmt.rs:115-116 (general) Co-Authored-By: Claude Haiku 5.5 Co-Authored-By: Claude Sonnet 5.5 --- crates/model/src/numfmt.rs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/crates/model/src/numfmt.rs b/crates/model/src/numfmt.rs index c3cf1713..f027f99a 100644 --- a/crates/model/src/numfmt.rs +++ b/crates/model/src/numfmt.rs @@ -113,7 +113,15 @@ fn general(v: f64, dec: char) -> String { } let a = v.abs(); let s = if !(1e-9..1e11).contains(&a) { - format!("{v:.5E}") + let s = format!("{v:.5E}"); + match s.split_once('E') { + Some((m, e)) => { + let m = if m.contains('.') { m.trim_end_matches('0').trim_end_matches('.') } else { m }; + let e: i32 = e.parse().unwrap_or(0); + format!("{m}E{}{:02}", if e < 0 { '-' } else { '+' }, e.abs()) + } + None => s, + } } else { let digits = (10 - (a.log10().floor() as i32 + 1)).clamp(0, 10) as usize; let s = format!("{v:.digits$}"); @@ -304,6 +312,10 @@ mod tests { assert_eq!(format("0%", 0.0, None), "0%"); assert_eq!(format("General", 2.5, Some("ru-RU")), "2,5"); assert_eq!(format("General", 400_000.0, Some("ru-RU")), "400000"); + assert_eq!(format("General", 1.5e12, None), "1.5E+12"); + assert_eq!(format("General", 1e-10, None), "1E-10"); + assert_eq!(format("General", -2.5e-12, None), "-2.5E-12"); + assert_eq!(format("General", 1e100, None), "1E+100"); assert_eq!(format("0.00", 1.23456, None), "1.23"); assert_eq!(format("#,##0.0#", 1234.5, None), "1,234.5"); assert_eq!(format("#,##0,", 12_345_678.0, None), "12,346");