From eb76d8dd23a35747455e3060b0f409bdeafcd612 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Hatcher?= Date: Sun, 16 Nov 2025 17:34:21 +0100 Subject: [PATCH] FIX: Issues with INT Fixes #535 --- base/src/cast.rs | 21 +++++++++++++----- base/src/functions/mathematical.rs | 8 +++++-- .../tests/calc_tests/TRUNC_INT_edgecases.xlsx | Bin 0 -> 14849 bytes 3 files changed, 22 insertions(+), 7 deletions(-) create mode 100644 xlsx/tests/calc_tests/TRUNC_INT_edgecases.xlsx diff --git a/base/src/cast.rs b/base/src/cast.rs index f12e06a..912594d 100644 --- a/base/src/cast.rs +++ b/base/src/cast.rs @@ -24,11 +24,22 @@ impl Model { CalcResult::Number(f) => Ok(NumberOrArray::Number(f)), CalcResult::String(s) => match s.parse::() { Ok(f) => Ok(NumberOrArray::Number(f)), - _ => Err(CalcResult::new_error( - Error::VALUE, - cell, - "Expecting number".to_string(), - )), + _ => { + let mut currencies = vec!["$", "€"]; + let currency = &self.locale.currency.symbol; + if !currencies.iter().any(|e| e == currency) { + currencies.push(currency); + } + // Try to parse as a formatted number (e.g., dates, currencies, percentages) + if let Ok((v, _number_format)) = parse_formatted_number(&s, ¤cies) { + return Ok(NumberOrArray::Number(v)); + } + Err(CalcResult::new_error( + Error::VALUE, + cell, + "Expecting number".to_string(), + )) + } }, CalcResult::Boolean(f) => { if f { diff --git a/base/src/functions/mathematical.rs b/base/src/functions/mathematical.rs index 4b21370..057fff6 100644 --- a/base/src/functions/mathematical.rs +++ b/base/src/functions/mathematical.rs @@ -1233,11 +1233,15 @@ impl Model { if !(-15.0..=15.0).contains(&num_digits) { return CalcResult::Number(value); } - CalcResult::Number(if value >= 0.0 { + let v = if value >= 0.0 { f64::floor(value * 10f64.powf(num_digits)) / 10f64.powf(num_digits) } else { f64::ceil(value * 10f64.powf(num_digits)) / 10f64.powf(num_digits) - }) + }; + if value.is_finite() && v.is_infinite() { + return CalcResult::Number(value); + } + CalcResult::Number(v) } single_number_fn!(fn_log10, |f| if f <= 0.0 { diff --git a/xlsx/tests/calc_tests/TRUNC_INT_edgecases.xlsx b/xlsx/tests/calc_tests/TRUNC_INT_edgecases.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..8d813023d02ed68cf9c7238cc6e4adfff7909bdc GIT binary patch literal 14849 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 literal 0 HcmV?d00001