Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java - How to format a number to a 2 char string?

Tags:

How would I format an int between 0 and 99 to a string which is 2 chars. E.g

4  becomes "04" 36 becomes "36" 

Thanks in advance.

like image 480
Ash Burlaczenko Avatar asked Nov 05 '11 22:11

Ash Burlaczenko


People also ask

What is %s and %D in Java?

%d means number. %0nd means zero-padded number with a length. You build n by subtraction in your example. %s is a string. Your format string ends up being this: "%03d%s", 0, "Apple"

What is %s in Java?

the %s is a 'format character', indicating "insert a string here". The extra parameters after the string in your two function calls are the values to fill into the format character placeholders: In the first example, %s will be replaced with the contents of the command variable.

How does %D work in Java?

%d: Specifies Decimal integer. %c: Specifies character. %T or %t: Specifies Time and date. %n: Inserts newline character.


2 Answers

Use String.format(). Example:

class Test{     public static void main(String[]args){         System.out.println(String.format("%02d", 42)); //42         System.out.println(String.format("%02d",  7)); //07     } } 

Edit:

luiscubal's comment got me thinking, so I figured why not benchmark the three alternatives.

import java.text.*;  interface Fmt{     public String f(int x); }  class Test{      static NumberFormat formatter = new DecimalFormat("00");      static Fmt f1 = new Fmt(){         public String f(int x){ return ((x<10)?"0":"") + x; }         public String toString(){return "f1";}     };      static Fmt f2 = new Fmt(){         public String f(int x){ return String.format("%02d", x); }         public String toString(){return "f2";}     };      static Fmt f3 = new Fmt(){         public String f(int x){ return formatter.format(x); }         public String toString(){return "f3";}     };      public static void main(String[]args){          Fmt[] fmts = new Fmt[]{f1, f2, f3, f3, f2, f1};          for (int x : new int[]{7, 42, 99}){              String s0 = null;             for (Fmt fmt : fmts)                 if (s0==null)                     s0 = fmt.f(x);                 else                     if (!fmt.f(x).equals(s0))                         System.exit(1);              System.out.printf("%02d\n", x);              for (Fmt fmt : fmts){                 String s = null;                 int count = 0;                 System.gc();                 long t0 = System.nanoTime();                 for (int i=0; i<100000; i++){                     count += fmt.f(x).length();                 }                 long t1 = System.nanoTime();                  System.out.printf("    %s:%8.2fms, count=%d\n",                     fmt, (t1-t0)/1000000.0, count);             }          }     }  } 

The output I got was:

07     f1:   11.28ms, count=200000     f2:  195.97ms, count=200000     f3:   45.41ms, count=200000     f3:   39.67ms, count=200000     f2:  164.46ms, count=200000     f1:    6.58ms, count=200000 42     f1:    5.25ms, count=200000     f2:  163.87ms, count=200000     f3:   42.78ms, count=200000     f3:   42.45ms, count=200000     f2:  163.87ms, count=200000     f1:    5.15ms, count=200000 99     f1:    5.83ms, count=200000     f2:  168.59ms, count=200000     f3:   42.86ms, count=200000     f3:   42.96ms, count=200000     f2:  165.48ms, count=200000     f1:    5.22ms, count=200000 

Turns out - if I tested correctly - that SpeedBirdNine had the most efficient solution, albeit badly presented. So I revise my solution to:

String answer = ((x<10)?"0":"") + x; 

In retrospect I think it makes sense, given that my initial solution incurred the cost of parsing the format string, and I'd assume Anthony's formatter also has some manner of data structure behind it being iterated every time.

And predictably a lot faster by keeping a String[] containing all the 100 strings, but that's probably overkill...

like image 61
Vlad Avatar answered Oct 02 '22 20:10

Vlad


You can do this using NumberFormat. E.g.,

NumberFormat formatter = new DecimalFormat("00"); String s = formatter.format(4);  
like image 27
Anthony Blake Avatar answered Oct 02 '22 18:10

Anthony Blake