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);
    }

}

  

posted @ 2020-11-13 17:38  guoAIrong  阅读(1131)  评论(0编辑  收藏  举报