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()
{