From 0a69aa29c58809b3e608947294836a7a35abf24b Mon Sep 17 00:00:00 2001 From: MarkBaker Date: Fri, 11 Feb 2022 12:52:25 +0100 Subject: [PATCH] Fix for DOLLARDE() and DOLLARFR() with negative dollar values --- CHANGELOG.md | 1 + src/PhpSpreadsheet/Calculation/Financial/Dollar.php | 4 ++-- tests/data/Calculation/Financial/DOLLARDE.php | 10 ++++++++++ tests/data/Calculation/Financial/DOLLARFR.php | 10 ++++++++++ 4 files changed, 23 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 08a0937e8a..b10abb0e1c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -49,6 +49,7 @@ and this project adheres to [Semantic Versioning](https://semver.org). ### Fixed +- Fix bug with `DOLLARDE()` and `DOLLARFR()` functions when the dollar value is negative [Issue #2578](https://github.com/PHPOffice/PhpSpreadsheet/issues/2578) [PR #2579](https://github.com/PHPOffice/PhpSpreadsheet/pull/2579) - Fix partial function name matching when translating formulae from Russian to English [Issue #2533](https://github.com/PHPOffice/PhpSpreadsheet/issues/2533) [PR #2534](https://github.com/PHPOffice/PhpSpreadsheet/pull/2534) - Various bugs related to Conditional Formatting Rules, and errors in the Xlsx Writer for Conditional Formatting [PR #2491](https://github.com/PHPOffice/PhpSpreadsheet/pull/2491) - Xlsx Reader merge range fixes. diff --git a/src/PhpSpreadsheet/Calculation/Financial/Dollar.php b/src/PhpSpreadsheet/Calculation/Financial/Dollar.php index 7bebb39178..4396ab1779 100644 --- a/src/PhpSpreadsheet/Calculation/Financial/Dollar.php +++ b/src/PhpSpreadsheet/Calculation/Financial/Dollar.php @@ -51,7 +51,7 @@ public static function decimal($fractionalDollar = null, $fraction = 0) return Functions::DIV0(); } - $dollars = floor($fractionalDollar); + $dollars = ($fractionalDollar < 0.0) ? ceil($fractionalDollar) : floor($fractionalDollar); $cents = fmod($fractionalDollar, 1); $cents /= $fraction; $cents *= 10 ** ceil(log10($fraction)); @@ -87,7 +87,7 @@ public static function fractional($decimalDollar = null, $fraction = 0) return Functions::DIV0(); } - $dollars = floor($decimalDollar); + $dollars = ($decimalDollar < 0.0) ? ceil($decimalDollar) : floor($decimalDollar); $cents = fmod($decimalDollar, 1); $cents *= $fraction; $cents *= 10 ** (-ceil(log10($fraction))); diff --git a/tests/data/Calculation/Financial/DOLLARDE.php b/tests/data/Calculation/Financial/DOLLARDE.php index eed6c8afd1..e3e0dca58e 100644 --- a/tests/data/Calculation/Financial/DOLLARDE.php +++ b/tests/data/Calculation/Financial/DOLLARDE.php @@ -3,6 +3,16 @@ // fractional_dollar, fraction, result return [ + [ + 2.5, + 1.6, + 4, + ], + [ + -2.5, + -1.6, + 4, + ], [ 1.125, 1.02, diff --git a/tests/data/Calculation/Financial/DOLLARFR.php b/tests/data/Calculation/Financial/DOLLARFR.php index 3d0fb61f1f..7b3b2a6c74 100644 --- a/tests/data/Calculation/Financial/DOLLARFR.php +++ b/tests/data/Calculation/Financial/DOLLARFR.php @@ -3,6 +3,16 @@ // decimal_dollar, fraction, result return [ + [ + 1.24, + 1.6, + 4, + ], + [ + -1.24, + -1.6, + 4, + ], [ 1.02, 1.125,