From c0b60fcb7695b51f257a8d691ada7035f96e81de Mon Sep 17 00:00:00 2001 From: MarkBaker Date: Mon, 20 Feb 2023 12:18:16 +0100 Subject: [PATCH] Issue 3381 - Fix decimal precision for Scientific Number Format Mask --- CHANGELOG.md | 2 +- .../Style/NumberFormat/NumberFormatter.php | 5 ++++- tests/data/Style/NumberFormat.php | 15 +++++++++++++++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2a0fa31f1..aedc79c93 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,7 +35,7 @@ and this project adheres to [Semantic Versioning](https://semver.org). - XLSX Writer - Array Formulas do not include function prefix [Issue #3337](https://github.com/PHPOffice/PhpSpreadsheet/issues/3337) [PR #3338](https://github.com/PHPOffice/PhpSpreadsheet/pull/3338) - Permit Max Column for Row Breaks [Issue #3143](https://github.com/PHPOffice/PhpSpreadsheet/issues/3143) [PR #3345](https://github.com/PHPOffice/PhpSpreadsheet/pull/3345) - AutoSize Columns should allow for dropdown icon when AutoFilter is for a Table [Issue #3356](https://github.com/PHPOffice/PhpSpreadsheet/issues/3356) [PR #3358](https://github.com/PHPOffice/PhpSpreadsheet/pull/3358) - +- Decimal Precision for Scientific Number Format Mask [Issue #3381](https://github.com/PHPOffice/PhpSpreadsheet/issues/3381) [PR #3382](https://github.com/PHPOffice/PhpSpreadsheet/pull/3382) ## 1.27.1 - 2023-02-08 diff --git a/src/PhpSpreadsheet/Style/NumberFormat/NumberFormatter.php b/src/PhpSpreadsheet/Style/NumberFormat/NumberFormatter.php index f089ebacf..d55c60991 100644 --- a/src/PhpSpreadsheet/Style/NumberFormat/NumberFormatter.php +++ b/src/PhpSpreadsheet/Style/NumberFormat/NumberFormatter.php @@ -164,7 +164,10 @@ class NumberFormatter if (preg_match('/[0#]E[+-]0/i', $format)) { // Scientific format - return sprintf('%5.2E', $valueFloat); + $decimals = strlen($right); + $size = $decimals + 3; + + return sprintf("%{$size}.{$decimals}E", $valueFloat); } elseif (preg_match('/0([^\d\.]+)0/', $format) || substr_count($format, '.') > 1) { if ($valueFloat == floor($valueFloat) && substr_count($format, '.') === 1) { $value *= 10 ** strlen(explode('.', $format)[1]); diff --git a/tests/data/Style/NumberFormat.php b/tests/data/Style/NumberFormat.php index da6d2778f..eb981a751 100644 --- a/tests/data/Style/NumberFormat.php +++ b/tests/data/Style/NumberFormat.php @@ -1479,4 +1479,19 @@ return [ '1111.119', '[$€-en_US]_(#,##0.00_);[$€-en_US] (#,##0.00)', ], + [ + '-1.2E+4', + -12345.6789, + '0.0E+00', + ], + [ + '-1.23E+4', + -12345.6789, + '0.00E+00', + ], + [ + '-1.235E+4', + -12345.6789, + '0.000E+00', + ], ];