From b2c07655c327f411fa714a3462d6be37a5969ccd Mon Sep 17 00:00:00 2001 From: vosikar Date: Wed, 30 Sep 2026 12:16:24 +0200 Subject: [PATCH] Filters: number() and bytes() with locale round half up like without locale, instead of NumberFormatter's default half-even --- src/Latte/Essential/Filters.php | 2 ++ tests/filters/bytes.phpt | 4 ++++ tests/filters/number.phpt | 4 ++++ 3 files changed, 10 insertions(+) diff --git a/src/Latte/Essential/Filters.php b/src/Latte/Essential/Filters.php index 94ad28403..d5aa41726 100644 --- a/src/Latte/Essential/Filters.php +++ b/src/Latte/Essential/Filters.php @@ -219,6 +219,7 @@ public function number( } $formatter = new \NumberFormatter($this->locale, \NumberFormatter::DECIMAL); + $formatter->setAttribute(\NumberFormatter::ROUNDING_MODE, \NumberFormatter::ROUND_HALFUP); if (is_string($patternOrDecimals)) { $formatter->setPattern($patternOrDecimals); } else { @@ -247,6 +248,7 @@ public function bytes(float $bytes, int $precision = 2): string $bytes = (string) round($bytes, $precision); } else { $formatter = new \NumberFormatter($this->locale, \NumberFormatter::DECIMAL); + $formatter->setAttribute(\NumberFormatter::ROUNDING_MODE, \NumberFormatter::ROUND_HALFUP); $formatter->setAttribute(\NumberFormatter::MAX_FRACTION_DIGITS, $precision); $bytes = $formatter->format($bytes); } diff --git a/tests/filters/bytes.phpt b/tests/filters/bytes.phpt index e3d1b416b..6ee0c07dd 100644 --- a/tests/filters/bytes.phpt +++ b/tests/filters/bytes.phpt @@ -16,6 +16,8 @@ test('no locale', function () { Assert::same('0 B', $filters->bytes(0.1)); Assert::same('-1.03 GB', $filters->bytes(-1024 * 1024 * 1050)); Assert::same('8881.78 PB', $filters->bytes(1e19)); + Assert::same('1.13 kB', $filters->bytes(1152)); + Assert::same('-1.13 kB', $filters->bytes(-1152)); }); @@ -26,4 +28,6 @@ test('with locale', function () { Assert::same('0 B', $filters->bytes(0.1)); Assert::same('-1,03 GB', $filters->bytes(-1024 * 1024 * 1050)); Assert::same('8 881,78 PB', $filters->bytes(1e19)); + Assert::same('1,13 kB', $filters->bytes(1152)); + Assert::same('-1,13 kB', $filters->bytes(-1152)); }); diff --git a/tests/filters/number.phpt b/tests/filters/number.phpt index 8663e035f..471aacd33 100644 --- a/tests/filters/number.phpt +++ b/tests/filters/number.phpt @@ -44,6 +44,9 @@ test('with locale', function () { Assert::same('-1 234', $filters->number(-1234)); Assert::same('-1 234,57', $filters->number(-1234.5678, 2)); Assert::same('NaN', $filters->number(NAN, 2)); + Assert::same('9,11', $filters->number(9.105, 2)); + Assert::same('-9,11', $filters->number(-9.105, 2)); + Assert::same('0,29', $filters->number(0.285, 2)); }); @@ -54,6 +57,7 @@ test('pattern', function () { Assert::same('00 123,4560', $filters->number(123.456, '00,000.0000')); Assert::same('3,14__', $filters->number(3.14, '##0.00*_')); Assert::same('Kč 3,14', $filters->number(3.14, '¤ #,##0.00')); + Assert::same('9,11', $filters->number(9.105, '#,##0.00')); });