diff --git a/hutool-core/src/main/java/cn/hutool/core/io/unit/DataSize.java b/hutool-core/src/main/java/cn/hutool/core/io/unit/DataSize.java index 982591ba6..d3a2512f1 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/unit/DataSize.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/unit/DataSize.java @@ -3,6 +3,7 @@ package cn.hutool.core.io.unit; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.StrUtil; +import java.math.BigDecimal; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -27,7 +28,7 @@ public final class DataSize implements Comparable { /** * The pattern for parsing. */ - private static final Pattern PATTERN = Pattern.compile("^([+\\-]?\\d+)([a-zA-Z]{0,2})$"); + private static final Pattern PATTERN = Pattern.compile("^([+\\-]?\\d+||(\\d+\\.\\d+))([a-zA-Z]{0,2})$"); /** * Bytes per Kilobyte(KB). @@ -130,6 +131,20 @@ public final class DataSize implements Comparable { return new DataSize(Math.multiplyExact(amount, unit.size().toBytes())); } + /** + * 获得指定{@link DataUnit}对应的{@link DataSize} + * + * @param amount 大小 + * @param unit 数据大小单位,null表示默认的BYTES + * @return {@link DataSize} + */ + public static DataSize of(BigDecimal amount, DataUnit unit) { + if(null == unit){ + unit = DataUnit.BYTES; + } + return new DataSize(amount.multiply(new BigDecimal(unit.size().toBytes())).longValue()); + } + /** * 获取指定数据大小文本对应的{@link DataSize}对象,如果无单位指定,默认获取{@link DataUnit#BYTES} *

@@ -171,9 +186,14 @@ public final class DataSize implements Comparable { try { Matcher matcher = PATTERN.matcher(text); Assert.state(matcher.matches(), "Does not match data size pattern"); - DataUnit unit = determineDataUnit(matcher.group(2), defaultUnit); - long amount = Long.parseLong(matcher.group(1)); - return DataSize.of(amount, unit); + DataUnit unit = determineDataUnit(matcher.group(3), defaultUnit); + String value = matcher.group(1); + if (value.indexOf(".") > -1) { + return DataSize.of(new BigDecimal(value), unit); + } else { + long amount = Long.parseLong(matcher.group(1)); + return DataSize.of(amount, unit); + } } catch (Exception ex) { throw new IllegalArgumentException("'" + text + "' is not a valid data size", ex); } diff --git a/hutool-core/src/test/java/cn/hutool/core/io/unit/DataSizeUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/io/unit/DataSizeUtilTest.java index 9297a65a4..cd1346366 100644 --- a/hutool-core/src/test/java/cn/hutool/core/io/unit/DataSizeUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/io/unit/DataSizeUtilTest.java @@ -18,6 +18,29 @@ public class DataSizeUtilTest { parse = DataSizeUtil.parse("3mb"); Assert.assertEquals(3145728, parse); + + parse = DataSizeUtil.parse("3.1M"); + Assert.assertEquals(3250585, parse); + + parse = DataSizeUtil.parse("3.1m"); + Assert.assertEquals(3250585, parse); + + parse = DataSizeUtil.parse("3.1MB"); + Assert.assertEquals(3250585, parse); + + parse = DataSizeUtil.parse("3.1mb"); + Assert.assertEquals(3250585, parse); + + parse = DataSizeUtil.parse("3.1"); + Assert.assertEquals(3, parse); + + try { + parse = DataSizeUtil.parse("3.1.3"); + } catch (IllegalArgumentException ie) { + Assert.assertEquals("'3.1.3' is not a valid data size", ie.getMessage()); + } + + } @Test