package freenet.support; /** * Size formatting utility. Uses IEC units. */ public class SizeUtil { public final static String[] suffixes = { "B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB" }; public static String formatSize(long bytes) { return formatSize(bytes, false); } public static String formatSizeWithoutSpace(long bytes) { String[] result = _formatSize(bytes); return result[0].concat(result[1]); } public static String formatSize(long bytes, boolean useNonBreakingSpace) { String[] result = _formatSize(bytes); return result[0].concat((useNonBreakingSpace ? "\u00a0" : " ")).concat(result[1]); } public static String[] _formatSize(long bytes) { long s = 1; int i; boolean negative = (bytes < 0); if (negative) bytes *= -1; for(i=0;i<SizeUtil.suffixes.length;i++) { if (s > Long.MAX_VALUE / 1024) { // Largest supported size break; } if(s * 1024 > bytes) { // Smaller than multiplier [i] - use the previous one break; } s *= 1024; } if (s == 1) // Bytes? Then we don't need real numbers with a comma { return new String[] { (negative ? "-" : "") + String.valueOf(bytes), SizeUtil.suffixes[0] }; } else { double mantissa = (double)bytes / (double)s; String o = String.valueOf(mantissa); if(o.indexOf('.') == 3) o = o.substring(0, 3); else if((o.indexOf('.') > -1) && (o.indexOf('E') == -1) && (o.length() > 4)) o = o.substring(0, 4); if (negative) o = "-" + o; if(i < SizeUtil.suffixes.length) // handle the case where the mantissa is Infinity return new String[] { o , SizeUtil.suffixes[i] }; return new String[] { o , "" }; } } }