From 3a2232cfef5351ac93d645f9589d7fd80be2fe46 Mon Sep 17 00:00:00 2001 From: NetterSilver <133535268+Silvertree2010@users.noreply.github.com> Date: Mon, 19 Oct 2026 18:31:57 +0200 Subject: [PATCH] Enter bare numbers in Percentage-formatted cells as percents Fixes #1967 Co-Authored-By: Claude Haiku 5.5 Co-Authored-By: Claude Sonnet 5.5 --- crates/engine/src/cmd/edit.rs | 12 +++++++++++- crates/engine/tests/percent_entry.rs | 20 ++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 crates/engine/tests/percent_entry.rs diff --git a/crates/engine/src/cmd/edit.rs b/crates/engine/src/cmd/edit.rs index c69bac208..4ab591044 100644 --- a/crates/engine/src/cmd/edit.rs +++ b/crates/engine/src/cmd/edit.rs @@ -176,7 +176,17 @@ pub(crate) fn input_to_cell(input: &str, sheet: usize, at: CellRef, wb: &mut gri } return Ok(Some(cell)); } - let parsed = gridcraft_core::parse::parse_input(input, wb.date_system); + let mut parsed = gridcraft_core::parse::parse_input(input, wb.date_system); + // Like Excel's automatic percent entry: a bare number of 1 or more typed into a cell already + // formatted as a percentage is a percent (3 -> 3%); smaller numbers are taken as fractions. + if parsed.format.is_none() + && !input.contains('%') + && wb.styles.get(style).num_fmt.as_str().ends_with('%') + && let Value::Number(n) = parsed.value + && n.abs() >= 1.0 + { + parsed.value = Value::Number(n / 100.0); + } let mut style = style; if let Some(code) = parsed.format { let cur = wb.styles.get(style).num_fmt.as_str().to_string(); diff --git a/crates/engine/tests/percent_entry.rs b/crates/engine/tests/percent_entry.rs new file mode 100644 index 000000000..d47b7d11d --- /dev/null +++ b/crates/engine/tests/percent_entry.rs @@ -0,0 +1,20 @@ +//! Typing a bare number into a Percentage-formatted cell enters it as a percent (issue #1967). + +use gridcraft_engine::display::cell_text; +use serde_json::json; + +fn enter(input: &str) -> String { + let mut s = gridcraft_engine::Session::new(); + s.new_workbook(); + s.execute("home.numberFormat", json!({"range": "A1", "format": "Percentage"})).unwrap(); + s.execute("cell.set", json!({"cell": "A1", "input": input})).unwrap(); + let d = s.doc().unwrap(); + cell_text(&d.wb, d.wb.active().unwrap(), gridcraft_engine::core::CellRef::new(0, 0)) +} + +#[test] +fn bare_number_in_percent_cell_is_a_percent() { + assert_eq!(enter("3"), "3.00%"); + assert_eq!(enter("0.03"), "3.00%"); + assert_eq!(enter("3%"), "3.00%"); +}