From 43f49ac9a51b81dfd07d3bc8dcfc5ec5637a5e3b Mon Sep 17 00:00:00 2001 From: cracksalad Date: Sun, 30 Apr 2023 15:30:23 +0200 Subject: [PATCH] fix: Support for locales using decimal separators other than . (dot) (#372) * Bugfix UnitConverter expects float got string (strict types enabled) * Bugfix for latest bugfix with huge numbers * Bugfix for german locale * Use number_format instead of str_replace(sprintf()) --- library/HTMLPurifier/UnitConverter.php | 6 +++--- tests/HTMLPurifier/UnitConverterTest.php | 7 +++++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/library/HTMLPurifier/UnitConverter.php b/library/HTMLPurifier/UnitConverter.php index 166f3bf30..b5a1eab5c 100644 --- a/library/HTMLPurifier/UnitConverter.php +++ b/library/HTMLPurifier/UnitConverter.php @@ -261,7 +261,7 @@ private function div($s1, $s2, $scale) */ private function round($n, $sigfigs) { - $new_log = (int)floor(log(abs($n), 10)); // Number of digits left of decimal - 1 + $new_log = (int)floor(log(abs((float)$n), 10)); // Number of digits left of decimal - 1 $rp = $sigfigs - $new_log - 1; // Number of decimal places needed $neg = $n < 0 ? '-' : ''; // Negative sign if ($this->bcmath) { @@ -276,7 +276,7 @@ private function round($n, $sigfigs) } return $n; } else { - return $this->scale(round($n, $sigfigs - $new_log - 1), $rp + 1); + return $this->scale(round((float)$n, $sigfigs - $new_log - 1), $rp + 1); } } @@ -300,7 +300,7 @@ private function scale($r, $scale) // Now we return it, truncating the zero that was rounded off. return substr($precise, 0, -1) . str_repeat('0', -$scale + 1); } - return sprintf('%.' . $scale . 'f', (float)$r); + return number_format((float)$r, $scale, '.', ''); } } diff --git a/tests/HTMLPurifier/UnitConverterTest.php b/tests/HTMLPurifier/UnitConverterTest.php index 53543f023..7c7472e08 100644 --- a/tests/HTMLPurifier/UnitConverterTest.php +++ b/tests/HTMLPurifier/UnitConverterTest.php @@ -101,6 +101,13 @@ public function testRoundingUserPrecision() $this->assertConversion('111.12pt', '1.5433in'); $this->assertConversion('11.112pt', '0.15433in'); } + + public function testDecimalSeparatorComma() + { + setlocale(LC_ALL, 'de_DE@euro', 'de_DE', 'deu_deu'); + $this->assertConversion('11.11px', '0.294cm'); + setlocale(LC_ALL, ''); + } public function testRoundingBigNumber() {