content: package net.csdn.common.unit;
  
  
  import net.csdn.common.Strings;
  import net.csdn.common.exception.ParseException;
  
  import java.io.Serializable;
  
  /**
   */
  public class SizeValue implements Serializable {
  
      private long size;
  
      private SizeUnit sizeUnit;
  
      private SizeValue() {
  
      }
  
      public SizeValue(long singles) {
          this(singles, SizeUnit.SINGLE);
      }
  
      public SizeValue(long size, SizeUnit sizeUnit) {
          this.size = size;
          this.sizeUnit = sizeUnit;
      }
  
      public long singles() {
          return sizeUnit.toSingles(size);
      }
  
      public long getSingles() {
          return singles();
      }
  
      public long kilo() {
          return sizeUnit.toKilo(size);
      }
  
      public long getKilo() {
          return kilo();
      }
  
      public long mega() {
          return sizeUnit.toMega(size);
      }
  
      public long getMega() {
          return mega();
      }
  
      public long giga() {
          return sizeUnit.toGiga(size);
      }
  
      public long getGiga() {
          return giga();
      }
  
      public double kiloFrac() {
          return ((double) singles()) / SizeUnit.C1;
      }
  
      public double getKiloFrac() {
          return kiloFrac();
      }
  
      public double megaFrac() {
          return ((double) singles()) / SizeUnit.C2;
      }
  
      public double getMegaFrac() {
          return megaFrac();
      }
  
      public double gigaFrac() {
          return ((double) singles()) / SizeUnit.C3;
      }
  
      public double getGigaFrac() {
          return gigaFrac();
      }
  
      @Override
      public String toString() {
          long singles = singles();
          double value = singles;
          String suffix = "";
          if (singles >= SizeUnit.C3) {
              value = gigaFrac();
              suffix = "g";
          } else if (singles >= SizeUnit.C2) {
              value = megaFrac();
              suffix = "m";
          } else if (singles >= SizeUnit.C1) {
              value = kiloFrac();
              suffix = "k";
          }
          return Strings.format1Decimals(value, suffix);
      }
  
      public static SizeValue parseSizeValue(String sValue) throws ParseException {
          return parseSizeValue(sValue, null);
      }
  
      public static SizeValue parseSizeValue(String sValue, SizeValue defaultValue) throws ParseException {
          if (sValue == null) {
              return defaultValue;
          }
          long singles;
          try {
              if (sValue.endsWith("b")) {
                  singles = Long.parseLong(sValue.substring(0, sValue.length() - 1));
              } else if (sValue.endsWith("k") || sValue.endsWith("K")) {
                  singles = (long) (Double.parseDouble(sValue.substring(0, sValue.length() - 1)) * SizeUnit.C1);
              } else if (sValue.endsWith("m") || sValue.endsWith("M")) {
                  singles = (long) (Double.parseDouble(sValue.substring(0, sValue.length() - 1)) * SizeUnit.C2);
              } else if (sValue.endsWith("g") || sValue.endsWith("G")) {
                  singles = (long) (Double.parseDouble(sValue.substring(0, sValue.length() - 1)) * SizeUnit.C3);
              } else {
                  singles = Long.parseLong(sValue);
              }
          } catch (NumberFormatException e) {
              throw new ParseException("Failed to parse [" + sValue + "]", e);
          }
          return new SizeValue(singles, SizeUnit.SINGLE);
      }
  
  
      @Override
      public boolean equals(Object o) {
          if (this == o) return true;
          if (o == null || getClass() != o.getClass()) return false;
  
          SizeValue sizeValue = (SizeValue) o;
  
          if (size != sizeValue.size) return false;
          if (sizeUnit != sizeValue.sizeUnit) return false;
  
          return true;
      }
  
      @Override
      public int hashCode() {
          int result = (int) (size ^ (size >>> 32));
          result = 31 * result + (sizeUnit != null ? sizeUnit.hashCode() : 0);
          return result;
      }
  }