package net.csdn.common.unit; import net.csdn.common.Strings; import net.csdn.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; } }