diff --git a/src/main/java/com/imyeyu/io/IOSize.java b/src/main/java/com/imyeyu/io/IOSize.java index 6ae4c12..988e311 100644 --- a/src/main/java/com/imyeyu/io/IOSize.java +++ b/src/main/java/com/imyeyu/io/IOSize.java @@ -1,5 +1,10 @@ package com.imyeyu.io; +import com.imyeyu.java.TimiJava; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + /** * 字节大小工具 * @@ -38,20 +43,13 @@ public class IOSize { EB; /** - * 转换指定单位字节量 + * 转换字节量 * - * @param unit 单位 * @param value 值 * @return 该单位值字节量 */ - public static long value(Unit unit, double value) { - Unit[] values = values(); - for (int i = 0; i < values.length; i++) { - if (values[i] == unit) { - return (long) (value * Math.pow(1024, i)); - } - } - return (long) value; + public long toBytes(double value) { + return (long) (value * Math.pow(1024, ordinal())); } } @@ -165,4 +163,66 @@ public class IOSize { } return "0"; } + + /** + * 将格式化的储存量字符串解析为字节量 + *
支持格式:10GB, 10 GB, 1TB, 1.24 KB 等(单位不区分大小写)
+ *
+ * // 返回 102400
+ * IOSize.parse("100 KB");
+ * // 返回 1073741824
+ * IOSize.parse("1GB");
+ *
+ *
+ * @param sizeStr 格式化后的储存量字符串
+ * @return 字节量
+ * @throws IllegalArgumentException 格式无效
+ */
+ public static long parse(String sizeStr) {
+ if (TimiJava.isEmpty(sizeStr)) {
+ throw new IllegalArgumentException("not found sizeStr");
+ }
+ // 正则匹配:可选符号 + 数字(含小数点)+ 可选空格 + 单位
+ Pattern pattern = Pattern.compile("([-+]?\\d+(?:\\.\\d+)?)\\s*([a-zA-Z]+)");
+ Matcher matcher = pattern.matcher(sizeStr.trim());
+ if (matcher.find()) {
+ double value;
+ try {
+ value = Double.parseDouble(matcher.group(1));
+ } catch (NumberFormatException e) {
+ throw new IllegalArgumentException("invalid number format: " + matcher.group(1), e);
+ }
+ if (value < 0) {
+ throw new IllegalArgumentException("size cannot be negative: " + value);
+ }
+ String unitStr = matcher.group(2).toUpperCase();
+ Unit unit;
+ try {
+ unit = Unit.valueOf(unitStr);
+ } catch (IllegalArgumentException e) {
+ // 处理单字母单位缩写(K/M/G/T/P/E)
+ unit = switch (unitStr.charAt(0)) {
+ case 'K' -> Unit.KB;
+ case 'M' -> Unit.MB;
+ case 'G' -> Unit.GB;
+ case 'T' -> Unit.TB;
+ case 'P' -> Unit.PB;
+ case 'E' -> Unit.EB;
+ case 'B' -> Unit.B;
+ default -> throw new IllegalArgumentException("Unknown unit: " + unitStr);
+ };
+ }
+ return unit.toBytes(value);
+ }
+ // 尝试解析纯数字(无单位,默认字节)
+ try {
+ long bytes = Long.parseLong(sizeStr.trim());
+ if (bytes < 0) {
+ throw new IllegalArgumentException("size cannot be negative: " + bytes);
+ }
+ return bytes;
+ } catch (NumberFormatException e) {
+ throw new IllegalArgumentException("invalid size format: " + sizeStr, e);
+ }
+ }
}