1. 任意单位互转
import java.math.BigDecimal; /** * @ClassName DataSize * @Description * @Author justin * @Date: 2020-11-13 11:14:55 */ public enum DataSizeConverter { BYTE("B") { @Override public double toByte(double size) { return roundHalfUp(size, D_BT, D_BT); } @Override public double toKb(double size) { return roundHalfUp(size, D_KB, D_BT); } @Override public double toMb(double size) { return roundHalfUp(size, D_MB, D_BT); } @Override public double toGb(double size) { return roundHalfUp(size, D_GB, D_BT); } @Override public double toTb(double size) { return roundHalfUp(size, D_TB, D_BT); } @Override public double toPb(double size) { return roundHalfUp(size, D_PB, D_BT); } @Override public DataSizeConverter upGrade() { return KB; } @Override public DataSizeConverter downGrade() { return BYTE; } //本平台byte为最小单位不能降级了,所以返回本身大小 @Override public double downGrade(double size) { return size; } }, KB("K") { @Override public double toByte(double size) { return roundHalfUp(size , D_BT, D_KB); } @Override public double toKb(double size) { return roundHalfUp(size , D_KB, D_KB); } @Override public double toMb(double size) { return roundHalfUp(size, D_MB, D_KB); } @Override public double toGb(double size) { return roundHalfUp(size, D_GB, D_KB); } @Override public double toTb(double size) { return roundHalfUp(size, D_TB, D_KB); } @Override public double toPb(double size) { return roundHalfUp(size, D_PB, D_KB); } @Override public DataSizeConverter upGrade() { return MB; } @Override public DataSizeConverter downGrade() { return BYTE; } }, MB("M") { @Override public double toByte(double size) { return roundHalfUp(size, D_BT, D_MB); } @Override public double toKb(double size) { return roundHalfUp(size, D_KB, D_MB); } @Override public double toMb(double size) { return roundHalfUp(size, D_MB, D_MB); } @Override public double toGb(double size) { return roundHalfUp(size, D_GB, D_MB); } @Override public double toTb(double size) { return roundHalfUp(size, D_TB, D_MB); } @Override public double toPb(double size) { return roundHalfUp(size, D_PB, D_MB); } @Override public DataSizeConverter upGrade() { return GB; } @Override public DataSizeConverter downGrade() { return KB; } }, GB("G") { @Override public double toByte(double size) { return roundHalfUp(size , D_BT, D_GB); } @Override public double toKb(double size) { return roundHalfUp(size , D_KB, D_GB); } @Override public double toMb(double size) { return roundHalfUp(size, D_MB, D_GB); } @Override public double toGb(double size) { return roundHalfUp(size, D_GB, D_GB); } @Override public double toTb(double size) { return roundHalfUp(size, D_TB, D_GB); } @Override public double toPb(double size) { return roundHalfUp(size, D_PB, D_GB); } @Override public DataSizeConverter upGrade() { return TB; } @Override public DataSizeConverter downGrade() { return MB; } }, TB("T") { @Override public double toByte(double size) { return roundHalfUp(size, D_BT, D_TB); } @Override public double toKb(double size) { return roundHalfUp(size, D_KB, D_TB); } @Override public double toMb(double size) { return roundHalfUp(size, D_MB, D_TB); } @Override public double toGb(double size) { return roundHalfUp(size, D_GB, D_TB); } @Override public double toTb(double size) { return roundHalfUp(size, D_TB, D_TB); } @Override public double toPb(double size) { return roundHalfUp(size, D_PB, D_TB); } @Override public DataSizeConverter upGrade() { return PB; } @Override public DataSizeConverter downGrade() { return GB; } }, PB("P") { @Override public double toByte(double size) { return roundHalfUp(size, D_BT, D_PB); } @Override public double toKb(double size) { return roundHalfUp(size, D_KB, D_PB); } @Override public double toMb(double size) { return roundHalfUp(size, D_MB, D_PB); } @Override public double toGb(double size) { return roundHalfUp(size, D_GB, D_PB); } @Override public double toTb(double size) { return roundHalfUp(size, D_TB, D_PB); } @Override public double toPb(double size) { return roundHalfUp(size, D_PB, D_PB); } @Override public DataSizeConverter upGrade() { return PB; } @Override public DataSizeConverter downGrade() { return TB; } //本平台PB为最大单位不能升级了,所以返回本身大小 @Override public double upGrade(double size) { return size; } }; public String getAbbrUnit() { return abbrUnit; } private String abbrUnit; private DataSizeConverter(String abbrUnit) { this.abbrUnit = abbrUnit; } private static final int DURATION = 1024; private static final long D_PB = 1L; private static final long D_TB = D_PB * DURATION; private static final long D_GB = D_TB * DURATION; private static final long D_MB = D_GB * DURATION; private static final long D_KB = D_MB * DURATION; private static final long D_BT = D_KB * DURATION; public double roundHalfUp(double size, long toUnit, long currentUnit) { return BigDecimal.valueOf(size) .multiply(new BigDecimal(toUnit)) .divide(new BigDecimal(currentUnit)) .setScale(2, BigDecimal.ROUND_HALF_UP) .doubleValue(); } public double toByte(double size) { throw new AbstractMethodError(); } public double toKb(double size) { throw new AbstractMethodError(); } public double toMb(double size) { throw new AbstractMethodError(); } public double toGb(double size) { throw new AbstractMethodError(); } public double toTb(double size) { throw new AbstractMethodError(); } public double toPb(double size) { throw new AbstractMethodError(); } /** * 数据大小降级 * 比如是MB, 降级为KB * @author YuGuo * @date 2020/11/13 17:00 * @param size * @return */ public double downGrade(double size) { return BigDecimal.valueOf(size).multiply(BigDecimal.valueOf(DURATION)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); } public DataSizeConverter downGrade() { throw new AbstractMethodError(); } public DataSizeConverter upGrade() { throw new AbstractMethodError(); } public double upGrade(double size) { return BigDecimal.valueOf(size).divide(BigDecimal.valueOf(DURATION), 2, BigDecimal.ROUND_HALF_UP).doubleValue(); } }
2.对上面的工具类扩展
package com.model.bo; import com.enmo.dbaas.util.DataSizeConverter; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; /** * @ClassName DataSizeBo * @Description * @Author justin * @Date: 2020-11-16 14:28:11 */ @Data @AllArgsConstructor @NoArgsConstructor public class DataSizeBo { private String size; private DataSizeConverter converter; /** * 获取的size带缩写的单位, 如:10G * @author YuGuo * @date 2020/11/16 16:21 * @param * @return */ public String getSizeWithAbbrUnit() { return size + converter.getAbbrUnit(); } }
package com.enmo.dbaas.util; import com.model.bo.DataSizeBo; import java.math.BigDecimal; import java.math.RoundingMode; import java.text.DecimalFormat; /** * @ClassName DataSize * @Description * @Author justin * @Date: 2020-11-13 11:14:55 */ public class DataSizeWrapper { private static DecimalFormat df = new DecimalFormat("#.##"); private static final int DURATION = 1024; static { df.setRoundingMode(RoundingMode.HALF_UP); } private DataSizeWrapper() { } public static DataSizeBo format(double size, DataSizeConverter converter) { // 比1小,说明需要降级,大单位降小单位 if (BigDecimal.valueOf(size).compareTo(BigDecimal.valueOf(1)) < 0) { // 说明已经达到最小值不能再往下降了 if (converter == DataSizeConverter.BYTE) { return new DataSizeBo(df.format(size), converter); } return format(converter.downGrade(size), converter.downGrade()); // 比1024大,说明需要升级,小单位升大单位 } else if (BigDecimal.valueOf(size).compareTo(BigDecimal.valueOf(DURATION)) >= 0) { // 说明已经达到最大值不能再往上升了 if (converter == DataSizeConverter.PB) { return new DataSizeBo(df.format(size), converter); } return format(converter.upGrade(size), converter.upGrade()); } // 在1 <=szie< 1024 说明不需要升级也不需要降级,直接返回 return new DataSizeBo(df.format(size), converter); } }