From 5edaf41caeb85b195448376271b18b1f1004b089 Mon Sep 17 00:00:00 2001 From: totalo Date: Sat, 10 Oct 2020 23:04:18 +0800 Subject: [PATCH] fixed #1155 --- .../java/cn/hutool/core/io/unit/DataSize.java | 28 ++++++++++++++++--- .../hutool/core/io/unit/DataSizeUtilTest.java | 12 ++++++++ 2 files changed, 36 insertions(+), 4 deletions(-) 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..c264c1a55 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,18 @@ 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); } @Test