zoukankan      html  css  js  c++  java
  • 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);
        }
    
    }
    

      

  • 相关阅读:
    逻辑学的基本运算
    第一性原理:First principle thinking是什么?
    人类认识的基本技能
    编程的本质:简化+抽象+再现
    区块链
    信号、系统、传递、树
    MVVM
    数据驱动 状态驱动
    事件与状态机 事件驱动编程
    数据一致性举例:登录系统
  • 原文地址:https://www.cnblogs.com/guoAIrong/p/13970549.html
Copyright © 2011-2022 走看看