From 3b3f170f07e4c2fcac321a1d35e0f371c045fa8a Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Wed, 15 Aug 2018 20:39:36 +0200 Subject: [PATCH] [platform] corrects rounding in unit formatting util (IDEA-CR-36060) --- .../openapi/util/text/StringUtilRt.java | 4 +-- .../intellij/util/text/StringUtilTest.java | 25 +++++++++++++------ 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/platform/util-rt/src/com/intellij/openapi/util/text/StringUtilRt.java b/platform/util-rt/src/com/intellij/openapi/util/text/StringUtilRt.java index 70d5a40d9f7e..7f6e9dd3493c 100644 --- a/platform/util-rt/src/com/intellij/openapi/util/text/StringUtilRt.java +++ b/platform/util-rt/src/com/intellij/openapi/util/text/StringUtilRt.java @@ -341,10 +341,10 @@ public class StringUtilRt { public static String formatFileSize(long fileSize, @NotNull String unitSeparator) { if (fileSize < 0) throw new IllegalArgumentException("Invalid value: " + fileSize); if (fileSize == 0) return '0' + unitSeparator + 'B'; - int rank = (int)(Math.log10(fileSize) / 3); + int rank = (int)((Math.log10(fileSize) + 0.0000021714778384307465) / 3); // (3 - Math.log10(999.995)) double value = fileSize / Math.pow(1000, rank); String[] units = {"B", "kB", "MB", "GB", "TB", "PB", "EB"}; - return new DecimalFormat("#,##0.##").format(value) + unitSeparator + units[rank]; + return new DecimalFormat("0.##").format(value) + unitSeparator + units[rank]; } @Contract(pure = true) diff --git a/platform/util/testSrc/com/intellij/util/text/StringUtilTest.java b/platform/util/testSrc/com/intellij/util/text/StringUtilTest.java index 7db218353752..e423241a8d23 100644 --- a/platform/util/testSrc/com/intellij/util/text/StringUtilTest.java +++ b/platform/util/testSrc/com/intellij/util/text/StringUtilTest.java @@ -495,15 +495,24 @@ public class StringUtilTest { assertEquals("2.15 GB", StringUtil.formatFileSize(Integer.MAX_VALUE)); assertEquals("9.22 EB", StringUtil.formatFileSize(Long.MAX_VALUE)); - assertEquals("60.1 kB", StringUtil.formatFileSize(60100)); + assertEquals("60.1 kB", StringUtil.formatFileSize(60_100)); - assertEquals("1.23 kB", StringUtil.formatFileSize(1234)); - assertEquals("12.35 kB", StringUtil.formatFileSize(12345)); - assertEquals("123.46 kB", StringUtil.formatFileSize(123456)); - assertEquals("1.23 MB", StringUtil.formatFileSize(1234567)); - assertEquals("12.35 MB", StringUtil.formatFileSize(12345678)); - assertEquals("123.46 MB", StringUtil.formatFileSize(123456789)); - assertEquals("1.23 GB", StringUtil.formatFileSize(1234567890)); + assertEquals("1.23 kB", StringUtil.formatFileSize(1_234)); + assertEquals("12.35 kB", StringUtil.formatFileSize(12_345)); + assertEquals("123.46 kB", StringUtil.formatFileSize(123_456)); + assertEquals("1.23 MB", StringUtil.formatFileSize(1234_567)); + assertEquals("12.35 MB", StringUtil.formatFileSize(1_2345_678)); + assertEquals("123.46 MB", StringUtil.formatFileSize(123_456_789)); + assertEquals("1.23 GB", StringUtil.formatFileSize(1_234_567_890)); + + assertEquals("999 B", StringUtil.formatFileSize(999)); + assertEquals("1 kB", StringUtil.formatFileSize(1000)); + assertEquals("999.99 kB", StringUtil.formatFileSize(999_994)); + assertEquals("1 MB", StringUtil.formatFileSize(999_995)); + assertEquals("999.99 MB", StringUtil.formatFileSize(999_994_999)); + assertEquals("1 GB", StringUtil.formatFileSize(999_995_000)); + assertEquals("999.99 GB", StringUtil.formatFileSize(999_994_999_999L)); + assertEquals("1 TB", StringUtil.formatFileSize(999_995_000_000L)); } @Test