1 package com.imcode.util;
2
3 import org.apache.commons.lang.time.DateUtils;
4 import org.apache.commons.lang.StringUtils;
5
6 import java.text.DecimalFormat;
7 import java.text.DecimalFormatSymbols;
8 import java.util.List;
9 import java.util.ArrayList;
10
11 /***
12 * Utilities for preparing data for human consumption.
13 */
14 public class HumanReadable {
15
16 private static final int ONE_KILOBYTE = 1024;
17 private static final int ONE_MEGABYTE = ONE_KILOBYTE * ONE_KILOBYTE;
18 private static final int ONE_GIGABYTE = ONE_MEGABYTE*ONE_KILOBYTE;
19
20 /***
21 * Format a byte size like for example "1 kB" or "1.5 MB".
22 *
23 * @param size The size to be formatted
24 * @return formatted size
25 **/
26 public static String getHumanReadableByteSize( long size ) {
27 double displaySize = size ;
28 DecimalFormat df = new DecimalFormat( "#.#" );
29 DecimalFormatSymbols decimalFormatSymbols = df.getDecimalFormatSymbols();
30 decimalFormatSymbols.setDecimalSeparator( '.' );
31 df.setDecimalFormatSymbols( decimalFormatSymbols );
32 String sizeSuffix = "B";
33 if (displaySize >= ONE_GIGABYTE) {
34 displaySize /= ONE_GIGABYTE ;
35 sizeSuffix = "GB";
36 } else if ( displaySize >= ONE_MEGABYTE ) {
37 displaySize /= ONE_MEGABYTE;
38 sizeSuffix = "MB";
39 } else if ( displaySize >= ONE_KILOBYTE ) {
40 displaySize /= ONE_KILOBYTE;
41 sizeSuffix = "kB";
42 }
43 return df.format(displaySize)+" "+sizeSuffix ;
44 }
45
46 /***
47 * Format a time span like for example "3h, 4m, 5s, 60ms"
48 *
49 * @param milliseconds
50 * @return formatted time span
51 */
52 public static String getHumanReadableTimeSpan(long milliseconds) {
53 long ms = milliseconds ;
54 TimeLengthSuffixPair[] pairs = new TimeLengthSuffixPair[] {
55 new TimeLengthSuffixPair( DateUtils.MILLIS_IN_HOUR, "h" ),
56 new TimeLengthSuffixPair( DateUtils.MILLIS_IN_MINUTE, "m" ),
57 new TimeLengthSuffixPair( DateUtils.MILLIS_IN_SECOND, "s" ),
58 new TimeLengthSuffixPair( 1, "ms" ),
59 };
60 List resultList = new ArrayList() ;
61 for ( int i = 0; i < pairs.length; i++ ) {
62 TimeLengthSuffixPair pair = pairs[i];
63 long timeLength = pair.timeLength;
64 if ( ms >= timeLength ) {
65 long unitTime = ms / timeLength;
66 ms %= timeLength;
67 resultList.add( unitTime + pair.suffix );
68 }
69 }
70 return StringUtils.join( resultList.iterator(), ", " ) ;
71 }
72
73 private static class TimeLengthSuffixPair {
74 long timeLength;
75 String suffix;
76
77 TimeLengthSuffixPair( long timeLength, String suffix ) {
78 this.timeLength = timeLength;
79 this.suffix = suffix;
80 }
81 }
82 }