Format numbers





8
Date Submitted Sun. Oct. 29th, 2006 10:32 AM
Revision 1 of 1
Scripter SCoon
Tags Format | Java | Number | String
Comments 0 comments
Configurable number formatter.
import java.util.List;
import java.util.ArrayList;

public class NumberFormatter {

  public static void main (String[] args) throws Exception {

    // Format duration
    System.out.println(formatNumber(1234567890,
                       new long[] { 1000, 60, 60, 60, 24 },
                       new String[] {
                                      " ms",     " ms",
                                      " second", " seconds",
                                      " minute", " minutes",
                                      " hour",   " hours",
                                      " day",    " days"
                                    }));

    // Format file size
    System.out.println(formatNumber(1234567890,
                       new long[] { 1024, 1024, 1024 },
                       new String[] { "b", "b",
                                      "K", "K",
                                      "M", "M",
                                      "G", "G" }));
  }

  public static String formatNumber (long value, long[] limits, String[] labels) {
    List parts = new ArrayList();
    if (value > 0) {
      dissectNumber(parts, value, limits, labels, 0);
    } else if (value == 0) {
      parts.add("0");
    } else {
      parts.add("- ");
      parts.add(formatNumber(-value, limits, labels));
    }
    StringBuffer text = new StringBuffer();
    String[] textParts = (String[]) parts.toArray(new String[0]);
    for (int i = 0, len = textParts.length; i < len; i += 2) {
      if (i > 0) {
        text.append(", ");
      }
      text.append(textParts[i]).append(textParts[i + 1]);
    }
    return String.valueOf(text);
  }

  protected static void dissectNumber (List parts, long value, long[] limits, String[] labels, int depth) {
    int labelIndex = depth * 2;
    if (depth == limits.length) {
      parts.add(0, labels[(value == 1) ? labelIndex : (labelIndex + 1)]);
      parts.add(0, String.valueOf(value));
    } else {
      long limit = limits[depth];
      long hi = value / limit;
      long lo = value % limit;
      if (lo > 0) {
        parts.add(0, labels[(lo == 1) ? labelIndex : (labelIndex + 1)]);
        parts.add(0, String.valueOf(lo));
      }
      if (hi > 0) {
        dissectNumber(parts, hi, limits, labels, depth + 1);
      }
    }
  }

}

...

 

Vladislav Zlobin

Comments

There are currently no comments for this snippet.

Voting