diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index fb3137578b..ca871c8e2d 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -71,6 +71,7 @@ Yii Framework 2 Change Log - Bug #4342: mssql (dblib) driver does not support getting attributes (tof06) - Bug #4409: Upper case letters in subdirectory prefixes of controller IDs were not properly handled (qiangxue) - Bug #4412: Formatter used SI Prefixes for base 1024, now uses binary prefixes (kmindi) +- Bug #4427: Formatter could do one division too much (kmindi) - Bug: Fixed inconsistent return of `\yii\console\Application::runAction()` (samdark) - Bug: URL encoding for the route parameter added to `\yii\web\UrlManager` (klimov-paul) - Bug: Fixed the bug that requesting protected or private action methods would cause 500 error instead of 404 (qiangxue) diff --git a/framework/base/Formatter.php b/framework/base/Formatter.php index e2839dbfe9..1fe60378ac 100644 --- a/framework/base/Formatter.php +++ b/framework/base/Formatter.php @@ -461,7 +461,7 @@ class Formatter extends Component $value = $value / $this->sizeFormat['base']; $position++; - } while ($position < 6); + } while ($position < 5); $value = round($value, $this->sizeFormat['decimals']); $formattedValue = isset($this->sizeFormat['decimalSeparator']) ? str_replace('.', $this->sizeFormat['decimalSeparator'], $value) : $value; diff --git a/tests/unit/framework/base/FormatterTest.php b/tests/unit/framework/base/FormatterTest.php index ecc201fae7..1643b8eacf 100644 --- a/tests/unit/framework/base/FormatterTest.php +++ b/tests/unit/framework/base/FormatterTest.php @@ -193,11 +193,13 @@ class FormatterTest extends TestCase public function testAsSize() { // tests for base 1000 $this->formatter->sizeFormat['base'] = 1000; + $this->assertSame("999 B", $this->formatter->asSize(999)); $this->assertSame("1.05 MB", $this->formatter->asSize(1024 * 1024)); $this->assertSame("1.05 MB", $this->formatter->asSize(1024 * 1024, false, false)); $this->assertSame("1 KB", $this->formatter->asSize(1000)); $this->assertSame("1.02 KB", $this->formatter->asSize(1023)); $this->assertSame("3 gigabytes", $this->formatter->asSize(3 * 1000 * 1000 * 1000, true)); + $this->assertNotSame("3 PB", $this->formatter->asSize(3 * 1000 * 1000 * 1000 * 1000 * 1000 * 1000)); // this is 3 EB not 3 PB // tests for base 1024 $this->formatter->sizeFormat['base'] = 1024; @@ -205,6 +207,8 @@ class FormatterTest extends TestCase $this->assertSame("1 MB", $this->formatter->asSize(1024 * 1024, false, false)); $this->assertSame("1023 B", $this->formatter->asSize(1023)); $this->assertSame("5 GiB", $this->formatter->asSize(5 * 1024 * 1024 * 1024)); + $this->assertSame("5 gibibytes", $this->formatter->asSize(5 * 1024 * 1024 * 1024,true)); + $this->assertNotSame("5 PiB", $this->formatter->asSize(5 * 1024 * 1024 * 1024 * 1024 * 1024 * 1024)); // this is 5 EiB not 5 PiB //$this->assertSame("1 YiB", $this->formatter->asSize(pow(2, 80))); $this->assertSame("2 GiB", $this->formatter->asSize(2147483647)); // round 1.999 up to 2 $this->formatter->sizeFormat['decimalSeparator'] = ',';