Difference between revisions of "Formatting"

From Suhrid.net Wiki
Jump to navigationJump to search
 
(4 intermediate revisions by the same user not shown)
Line 17: Line 17:
 
System.out.printf("The sum of %d and %d is %d", i, j, (i+j));
 
System.out.printf("The sum of %d and %d is %d", i, j, (i+j));
  
 +
== Formatter Class ==
 +
 +
* The java.util.Formatter is the class that contains all the string format functionality through it's format() methods.
 +
* System.out.printf()/System.out.format()/String.format() etc all utilize the Formatter class.
 +
* A formatter can be constructed with output sources such as a StringBuffer, a File or an OutputStream.
 +
* Example here is a formatter, writing to a file:
 +
 +
<syntaxhighlight lang="java5">
 +
 +
                File piFile = new File("/tmp/pi.txt");
 +
                piFile.createNewFile();
 +
System.out.println("Created file");
 +
Formatter f2 = new Formatter(piFile);
 +
f2.format("The value of PI rounded to %d decimals is %.3f", 3, Math.PI);
 +
System.out.println("Formatted to file");
 +
f2.close();
 +
 +
</syntaxhighlight>
  
 
== Format String ==
 
== Format String ==
 
  
 
* Syntax:
 
* Syntax:
Line 27: Line 44:
 
* Every argument must have a format string in the above syntax, or it wont be printed!
 
* Every argument must have a format string in the above syntax, or it wont be printed!
  
Arguments within [] are optional. Only the conversion_char is mandatory. The following are the conversion chars:  
+
Arguments within [] are optional. Only the conversion_char is mandatory. The following are the basic conversion chars:  
 
   
 
   
 
* b - boolean
 
* b - boolean
Line 34: Line 51:
 
* f - floating point
 
* f - floating point
 
* s - string
 
* s - string
 +
* n - line separator
 +
 +
There are many more conversion chars for each data type:
 +
 +
* Integers have o, x for octal/hex.
 +
* Floats have e (scientific), g, A - esoteric usage.
 +
 +
  
 
Optional arguments
 
Optional arguments
Line 81: Line 106:
 
* Finally the precision -  a number prefix with a ".". This is to indicate the number of digits to print after a decimal point. This applies only to floats.
 
* Finally the precision -  a number prefix with a ".". This is to indicate the number of digits to print after a decimal point. This applies only to floats.
  
 
+
* The format() method is very strict about data types. It will not try to format float as int or int as float etc. A java.util.IllegalFormatConversionException will be thrown.
 +
* There is a whole bunch of runtime exceptions associated with string formating. All are subclasses of IllegalFormatException.
 +
e.g. IllegalFormatFlagsException, IllegalFormatPrecisionException etc. etc.
 +
* Note that Some of the output can be written by format and then the exception can be thrown mid-way.
  
 
[[Category:OCPJP]]
 
[[Category:OCPJP]]

Latest revision as of 10:08, 5 September 2011

Introduction

  • String formatting can be done using the printf() and the format() methods added in java.io.PrintStream (System.out is a PrintStream)
  • Internally they ise the java.util.Formatter class.
  • Basic format:

printf("format string", argument(s));

  • It can be cleaner to use:
  • When we want to use variables and strings in a print, it can get irritating to keep concatenating and keeping the whitespaces and commas in mind:

System.out.println("The sum of " + i + " and " + j + " is " + (i+j));

  • A printf, can make things easier:

System.out.printf("The sum of %d and %d is %d", i, j, (i+j));

Formatter Class

  • The java.util.Formatter is the class that contains all the string format functionality through it's format() methods.
  • System.out.printf()/System.out.format()/String.format() etc all utilize the Formatter class.
  • A formatter can be constructed with output sources such as a StringBuffer, a File or an OutputStream.
  • Example here is a formatter, writing to a file:
                File piFile = new File("/tmp/pi.txt");
                piFile.createNewFile();
		System.out.println("Created file");
		Formatter f2 = new Formatter(piFile);
		f2.format("The value of PI rounded to %d decimals is %.3f", 3, Math.PI);
		System.out.println("Formatted to file");
		f2.close();

Format String

  • Syntax:

%[arg_index$][flags][width][.precision] conversion_char

  • Every argument must have a format string in the above syntax, or it wont be printed!

Arguments within [] are optional. Only the conversion_char is mandatory. The following are the basic conversion chars:

  • b - boolean
  • c - char
  • d - integer
  • f - floating point
  • s - string
  • n - line separator

There are many more conversion chars for each data type:

  • Integers have o, x for octal/hex.
  • Floats have e (scientific), g, A - esoteric usage.


Optional arguments

  • arg_index is the number of the argument followed by a $. The no starts from 1.
  • example:
System.out.printf("%2$s , %1$s", "Suhrid", "Karthik");
//Prints : Karthik, Suhrid
  • flags
    • "-" : Left justify
    • "+" : Include a sign
    • "0" : Pad with zeroes
    • "," : Use locale specific group separators
    • "(" : Enclose -ve numbers in brackets
  • examples:
int i = 11;
int j = -22;
out.printf("%+d , %+d", i, j);
//prints: +11 , -22
  • Some flags require width to be mandatory - e.g. left-justify and zero-pad.
  • width indicates the minimum number of characters to print.
out.printf("%3d", 101231);
//prints 101231.

out.printf("%5d", 17);
//prints "   17"


  • Finally the precision - a number prefix with a ".". This is to indicate the number of digits to print after a decimal point. This applies only to floats.
  • The format() method is very strict about data types. It will not try to format float as int or int as float etc. A java.util.IllegalFormatConversionException will be thrown.
  • There is a whole bunch of runtime exceptions associated with string formating. All are subclasses of IllegalFormatException.

e.g. IllegalFormatFlagsException, IllegalFormatPrecisionException etc. etc.

  • Note that Some of the output can be written by format and then the exception can be thrown mid-way.