Byte、KB、MB、GB、TB、PB转换
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);
}
}

浙公网安备 33010602011771号