From 18b15981fecad3fc59bd1b837d945345a65da8f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavel=20Konvi=C4=8Dka?= Date: Thu, 30 Jan 2025 00:57:47 +0100 Subject: [PATCH] Replace number_format to handle large numbers and overflow --- src/Column/ColumnNumber.php | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/src/Column/ColumnNumber.php b/src/Column/ColumnNumber.php index 64e6ff08..63394c8b 100644 --- a/src/Column/ColumnNumber.php +++ b/src/Column/ColumnNumber.php @@ -23,12 +23,27 @@ public function getColumnValue(Row $row): mixed return $value; } - return number_format( - (float) $value, - (int) $this->numberFormat[0], - (string) $this->numberFormat[1], - (string) $this->numberFormat[2] - ); + $decimal = null; + $value = (string) $value; + + if (str_contains($value, '.')) { + list($integer, $decimal) = explode('.', $value, 2); + } + else { + $integer = $value; + } + + if ($this->numberFormat[0] > 0) { + $decimal = substr( + $decimal . str_repeat('0', $this->numberFormat[0]), + 0, + $this->numberFormat[0] + ); + } + + $integer = preg_replace('/\B(?=(\d{3})+(?!\d))/', $this->numberFormat[2], $integer); + + return $decimal ? $integer . $this->numberFormat[1] . $decimal : $integer; } /**