Java - Convert Human Readable Size to Bytes

匿名 (未验证) 提交于 2019-12-03 02:03:01

问题:

I've found lots of information about converting raw byte information into a human-readable format, but I need to do the opposite, i.e. convert the String "1.6 GB" into the long value 1717990000. Is there an in-built/well-defined way to do this, or will I pretty much have to roll my own?

[Edit]: Here is my first stab...

static class ByteFormat extends NumberFormat {     @Override     public StringBuffer format(double arg0, StringBuffer arg1, FieldPosition arg2) {         // TODO Auto-generated method stub         return null;     }      @Override     public StringBuffer format(long arg0, StringBuffer arg1, FieldPosition arg2) {         // TODO Auto-generated method stub         return null;     }      @Override     public Number parse(String arg0, ParsePosition arg1) {         return parse (arg0);     }      @Override     public Number parse(String arg0) {         int spaceNdx = arg0.indexOf(" ");         double ret = Double.parseDouble(arg0.substring(0, spaceNdx));         String unit = arg0.substring(spaceNdx + 1);         int factor = 0;         if (unit.equals("GB")) {             factor = 1073741824;         }         else if (unit.equals("MB")) {             factor = 1048576;         }         else if (unit.equals("KB")) {             factor = 1024;         }          return ret * factor;     } }

回答1:

I've never heard about such well-known library, which implements such text-parsing utility methods. But your solution seems to be near from correct implementation.

The only two things, which I'd like to correct in your code are:

  1. define method Number parse(String arg0) as static due to it utility nature

  2. define factors for each type of size definition as final static fields.

I.e. it will be like this one:

private final static long KB_FACTOR = 1024; private final static long MB_FACTOR = 1024 * KB_FACTOR; private final static long GB_FACTOR = 1024 * MB_FACTOR;  public static double parse(String arg0) {     int spaceNdx = arg0.indexOf(" ");     double ret = Double.parseDouble(arg0.substring(0, spaceNdx));     switch (arg0.substring(spaceNdx + 1)) {         case "GB":             return ret * GB_FACTOR;         case "MB":             return ret * MB_FACTOR;         case "KB":             return ret * KB_FACTOR;     }     return -1; }


回答2:

A revised version of Andremoniy's answer that properly distinguishes between kilo and kibi, etc.

private final static long KB_FACTOR = 1000; private final static long KIB_FACTOR = 1024; private final static long MB_FACTOR = 1000 * KB_FACTOR; private final        
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!