From 6d1a2e5ba613d4c4b730e05b0d31c265e24bea8f Mon Sep 17 00:00:00 2001 From: Looly Date: Tue, 16 Sep 2025 11:03:51 +0800 Subject: [PATCH] =?UTF-8?q?`DataSizeUtil`=E6=94=B9=E8=BF=9B=EF=BC=8C?= =?UTF-8?q?=E5=85=BC=E5=AE=B9`GiB`=E7=AD=89=E5=8D=95=E4=BD=8D=E5=90=8D?= =?UTF-8?q?=E7=A7=B0=EF=BC=88issue#ICXXVF@Github=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/cn/hutool/v7/core/io/unit/DataSize.java | 2 +- .../main/java/cn/hutool/v7/core/io/unit/DataUnit.java | 10 ++++++++-- .../cn/hutool/v7/core/io/unit/DataSizeUtilTest.java | 6 ++++++ 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/v7/core/io/unit/DataSize.java b/hutool-core/src/main/java/cn/hutool/v7/core/io/unit/DataSize.java index 8dcc8e26c1..df475ae36e 100644 --- a/hutool-core/src/main/java/cn/hutool/v7/core/io/unit/DataSize.java +++ b/hutool-core/src/main/java/cn/hutool/v7/core/io/unit/DataSize.java @@ -44,7 +44,7 @@ public final class DataSize implements Comparable { /** * The pattern for parsing. */ - private static final Pattern PATTERN = Pattern.compile("^([+-]?\\d+(\\.\\d+)?)([a-zA-Z]{0,2})$"); + private static final Pattern PATTERN = Pattern.compile("^([+-]?\\d+(\\.\\d+)?)([a-zA-Z]{0,3})$"); /** * Bytes per Kilobyte(KB). diff --git a/hutool-core/src/main/java/cn/hutool/v7/core/io/unit/DataUnit.java b/hutool-core/src/main/java/cn/hutool/v7/core/io/unit/DataUnit.java index ae440c26f5..90611eb0ea 100644 --- a/hutool-core/src/main/java/cn/hutool/v7/core/io/unit/DataUnit.java +++ b/hutool-core/src/main/java/cn/hutool/v7/core/io/unit/DataUnit.java @@ -16,6 +16,7 @@ package cn.hutool.v7.core.io.unit; +import cn.hutool.v7.core.text.CharUtil; import cn.hutool.v7.core.text.StrUtil; /** @@ -105,11 +106,16 @@ public enum DataUnit { /** * 通过后缀返回对应的 DataUnit * - * @param suffix 单位后缀 + * @param suffix 单位后缀,如KB、GB、GiB等 * @return 匹配到的{@link DataUnit} * @throws IllegalArgumentException 后缀无法识别报错 */ - public static DataUnit fromSuffix(final String suffix) { + public static DataUnit fromSuffix(String suffix) { + // issue#ICXXVF 兼容KiB、MiB、GiB + if(StrUtil.length(suffix) == 3 && CharUtil.equals(suffix.charAt(1), 'i', true)){ + suffix = new String(new char[]{suffix.charAt(0), suffix.charAt(2)}); + } + for (final DataUnit candidate : values()) { // 支持类似于 3MB,3M,3m等写法 if (StrUtil.startWithIgnoreCase(candidate.suffix, suffix)) { diff --git a/hutool-core/src/test/java/cn/hutool/v7/core/io/unit/DataSizeUtilTest.java b/hutool-core/src/test/java/cn/hutool/v7/core/io/unit/DataSizeUtilTest.java index 5a31ddf0ec..d91d0cf7d5 100644 --- a/hutool-core/src/test/java/cn/hutool/v7/core/io/unit/DataSizeUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/v7/core/io/unit/DataSizeUtilTest.java @@ -83,4 +83,10 @@ public class DataSizeUtilTest { final long bytes = DataSize.parse(size).toBytes(); Assertions.assertEquals(10244587, bytes); } + + @Test + void issueICXXVFTest(){ + final long parse = DataSizeUtil.parse("279.40GiB"); + Assertions.assertEquals(300003465625L, parse); + } }