From 3617d0a569b03d16ca48f0ea50804616830bdd16 Mon Sep 17 00:00:00 2001 From: Looly Date: Sun, 11 Oct 2020 14:04:45 +0800 Subject: [PATCH] DataSizeUtil support decimal --- CHANGELOG.md | 1 + .../java/cn/hutool/core/io/unit/DataSize.java | 52 +++++++++---------- .../hutool/core/io/unit/DataSizeUtilTest.java | 8 ++- 3 files changed, 32 insertions(+), 29 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6ca1e8f11..c68a22b24 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ * 【core 】 优化StrUtil中部分参数校验以及逻辑处理(pr#1144@Github) * 【core 】 简化CreditCode逻辑去除无用Character.toUpperCase(pr#1145@Github) * 【core 】 NumberUtil增加generateRandomNumber重载,可自定义seed(issue#I1XTUT@Gitee) +* 【core 】 DataSizeUtil支持小数(pr#1158@Github) ### Bug修复 * 【core 】 解决农历判断节日未判断大小月导致的问题(issue#I1XHSF@Gitee) 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 d3a2512f1..2a07d0044 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 @@ -28,7 +28,7 @@ public final class DataSize implements Comparable { /** * The pattern for parsing. */ - private static final Pattern PATTERN = Pattern.compile("^([+\\-]?\\d+||(\\d+\\.\\d+))([a-zA-Z]{0,2})$"); + private static final Pattern PATTERN = Pattern.compile("^([+-]?\\d+(\\.\\d+)?)([a-zA-Z]{0,2})$"); /** * Bytes per Kilobyte(KB). @@ -68,61 +68,61 @@ public final class DataSize implements Comparable { /** - * 获得对应bytes的{@link DataSize} + * 获得对应bytes的DataSize * * @param bytes bytes大小,可正可负 - * @return a {@link DataSize} + * @return this */ public static DataSize ofBytes(long bytes) { return new DataSize(bytes); } /** - * 获得对应kilobytes的{@link DataSize} + * 获得对应kilobytes的DataSize * * @param kilobytes kilobytes大小,可正可负 - * @return a {@link DataSize} + * @return a DataSize */ public static DataSize ofKilobytes(long kilobytes) { return new DataSize(Math.multiplyExact(kilobytes, BYTES_PER_KB)); } /** - * 获得对应megabytes的{@link DataSize} + * 获得对应megabytes的DataSize * * @param megabytes megabytes大小,可正可负 - * @return a {@link DataSize} + * @return a DataSize */ public static DataSize ofMegabytes(long megabytes) { return new DataSize(Math.multiplyExact(megabytes, BYTES_PER_MB)); } /** - * 获得对应gigabytes的{@link DataSize} + * 获得对应gigabytes的DataSize * * @param gigabytes gigabytes大小,可正可负 - * @return a {@link DataSize} + * @return a DataSize */ public static DataSize ofGigabytes(long gigabytes) { return new DataSize(Math.multiplyExact(gigabytes, BYTES_PER_GB)); } /** - * 获得对应terabytes的{@link DataSize} + * 获得对应terabytes的DataSize * * @param terabytes terabytes大小,可正可负 - * @return a {@link DataSize} + * @return a DataSize */ public static DataSize ofTerabytes(long terabytes) { return new DataSize(Math.multiplyExact(terabytes, BYTES_PER_TB)); } /** - * 获得指定{@link DataUnit}对应的{@link DataSize} + * 获得指定{@link DataUnit}对应的DataSize * * @param amount 大小 * @param unit 数据大小单位,null表示默认的BYTES - * @return {@link DataSize} + * @return DataSize */ public static DataSize of(long amount, DataUnit unit) { if(null == unit){ @@ -132,11 +132,12 @@ public final class DataSize implements Comparable { } /** - * 获得指定{@link DataUnit}对应的{@link DataSize} + * 获得指定{@link DataUnit}对应的DataSize * * @param amount 大小 * @param unit 数据大小单位,null表示默认的BYTES - * @return {@link DataSize} + * @return DataSize + * @since 5.4.5 */ public static DataSize of(BigDecimal amount, DataUnit unit) { if(null == unit){ @@ -146,7 +147,7 @@ public final class DataSize implements Comparable { } /** - * 获取指定数据大小文本对应的{@link DataSize}对象,如果无单位指定,默认获取{@link DataUnit#BYTES} + * 获取指定数据大小文本对应的DataSize对象,如果无单位指定,默认获取{@link DataUnit#BYTES} *

* 例如: *

@@ -156,7 +157,7 @@ public final class DataSize implements Comparable {
 	 * 
* * @param text the text to parse - * @return the parsed {@link DataSize} + * @return the parsed DataSize * @see #parse(CharSequence, DataUnit) */ public static DataSize parse(CharSequence text) { @@ -164,7 +165,7 @@ public final class DataSize implements Comparable { } /** - * Obtain a {@link DataSize} from a text string such as {@code 12MB} using + * Obtain a DataSize from a text string such as {@code 12MB} using * the specified default {@link DataUnit} if no unit is specified. *

* The string starts with a number followed optionally by a unit matching one of the @@ -179,21 +180,16 @@ public final class DataSize implements Comparable { * * @param text the text to parse * @param defaultUnit 默认的数据单位 - * @return the parsed {@link DataSize} + * @return the parsed DataSize */ public static DataSize parse(CharSequence text, DataUnit defaultUnit) { Assert.notNull(text, "Text must not be null"); try { - Matcher matcher = PATTERN.matcher(text); + final Matcher matcher = PATTERN.matcher(text); Assert.state(matcher.matches(), "Does not match data size pattern"); - 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); - } + + final DataUnit unit = determineDataUnit(matcher.group(3), defaultUnit); + return DataSize.of(new BigDecimal(matcher.group(1)), 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 cd1346366..56372834f 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 @@ -28,6 +28,12 @@ public class DataSizeUtilTest { parse = DataSizeUtil.parse("3.1MB"); 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.1mb"); Assert.assertEquals(3250585, parse); @@ -35,7 +41,7 @@ public class DataSizeUtilTest { Assert.assertEquals(3, parse); try { - parse = DataSizeUtil.parse("3.1.3"); + DataSizeUtil.parse("3.1.3"); } catch (IllegalArgumentException ie) { Assert.assertEquals("'3.1.3' is not a valid data size", ie.getMessage()); }