Here's some rambling on String.format() stuff in Java. Most of this is from elsewhere, http://www.xinotes.org/notes/note/1195/ with additions by me.
package com.etretatlogiciels.samples.string.format; import static java.lang.System.out; import java.util.Date; public class StringFormat { public static void simpleFormat() { out.println( "simpleFormat():" ); out.println( String.format( " Hi %s, you owe me $%5.2f.", "Jack", 25. ) ); } public static void testArgumentIndex() { out.println( "\ntestArgumentIndex():" ); out.println( String.format( " A number may be formatted as a string \"%1$s\"" + " or a number %1$d", 10 ) ); // note the %n format specifier. It starts a new line // but does not consume an argument index from the list out.println( String.format( "%n Mixing indexed and unindexed arguments: " + "%n %5$s %s %2$s %s %4$s %s %s", "one", "two", "three", "four", "five" ) ); } public static void testCharacter() { out.println( "\ntestCharacter():" ); out.println( String.format( " '%1$s', '%1$c', '%1$C'", 97 ) ); } public static void testInteger() { out.println( "\ntestInteger():" ); out.println( String.format( " %d, %o, %h, %H", 161, 161, 161, 161 ) ); // try big number with and without group separator out.println( String.format( " %1$d, %1$,d", 161161161161L ) ); } public static void testFloat() { out.println( "\ntestFloat():" ); out.println( String.format( " %1$.2e, %1$.2f, %1$.2g, %1$.2a", 12345678.9999932 ) ); } public static void testDate() { out.println( "\ntestDate():" ); long currentTime = System.currentTimeMillis(); Date date = new java.util.Date( currentTime ); out.println( String.format( " Current Time: %1$tm/%1$td/%1$tY %1$tH:%1$tM:%1$tS", currentTime ) ); // same as above but using shorthand notation out.println( String.format( " Current Time (using composition suffix): %1$tD %1$tT", currentTime ) ); out.println( String.format( " Current Time (using Date object): %1$tm/%1$td/%1$tY %1$tH:%1$tM:%1$tS", date ) ); } public static void testFlags() { out.println( "\ntestFlags():" ); out.println( String.format( " '%1$s', '%1$#s', '%1$-10.8s', '%1$.12s', '%1$-25s'", "Huge Fruit, Inc." ) ); } public static void testGeneral() { out.println( "\ntestGeneral():" ); out.println( // any object can be formatted as string // upper case S converts string to upper case String.format( " %s, %S, %S, %S, %s", "String", "String", null, ( byte ) 1, 5.6 ) ); out.println( // any object can be formatted as boolean // upper case B prints TRUE or FALSE String.format( " %b, %B, %b, %B", "String", null, ( byte ) 1, 5.6 ) ); out.println( // any object can be formatted as hex // upper case H prints hex in uppercase String.format( " %h, %H, %H, %h, %H", "161", null, 161, new Integer( 161 ), 5.6 ) ); // What's the effect of width.precision on String? out.println( String.format( " \"%1$s\", \"%1$14s\", \"%1$14.2s\"", "Hello" ) ); } public static void main( String[] args ) { simpleFormat(); testArgumentIndex(); testCharacter(); testInteger(); testFloat(); testDate(); testFlags(); testGeneral(); } }
simpleFormat(): Hi Jack, you owe me $25.00. testArgumentIndex(): A number may be formatted as a string "10" or a number 10 Mixing indexed and unindexed arguments: five one two two four three four testCharacter(): '97', 'a', 'A' testInteger(): 161, 241, a1, A1 161161161161, 161,161,161,161 testFloat(): 1.23e+07, 12345679.00, 1.2e+07, 0x1.79p23 testDate(): Current Time: 09/17/2011 09:03:56 Current Time (using composition suffix): 09/17/11 09:03:56 Current Time (using Date object): 09/17/2011 09:03:56 testFlags(): 'Huge Fruit, Inc.', 'Huge Fruit, Inc.', 'Huge Fru ', 'Huge Fruit, ', 'Huge Fruit, Inc. ' testGeneral(): String, STRING, NULL, 1, 5.6 true, FALSE, true, TRUE beac, NULL, A1, a1, 26700000 "Hello", " Hello", " He"