Zahlenformatierungen in Java
Diese Lektion stellt klassische Möglichkeiten zur Zahlenformatierung vor aus den 90er Jahren vor. In neueren Java -Versionen (seit 2004) sind diese durch weitere Möglichkeiten ergänzt worden, die teilweise bequemer verwendet werden können. In einzelnen Fällen könnte es aber dennoch einmal hilfreich sein, auch die hier vorgestellten klassischen Formatierungsmöglichkeiten zu kennen.
Objekte der Klasse »java.text.DecimalFormat« können Gleitkommazahlen als Text darstellen, die Art der Darstellung kann dabei in verschiedener Weise gesteuert werden.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ final java.text.DecimalFormat twoDigits = new java.text.DecimalFormat( "0.00" );
java.lang.System.out.println( twoDigits.format( 3.159 ));
java.lang.System.out.println( twoDigits.format( 3.1 ));
java.lang.System.out.println( twoDigits.format( 3 )); }}transcript (System mit Dezimalkomma)
3,16
3,10
3,00transcript (System mit Dezimalpunkt)
3.16
3.10
3.00
Das Dezimaltrennzeichen
Die Formatierung verwendet den Schauplatz des Programmes, sie hängt also von der Ausführungsumgebung ab. Wenn das Programm auf einem System läuft, dessen Dezimaltrennzeichen das Komma »,« ist, dann wird das hier auch zur Darstellung der Zahl verwendet. Wir nehmen in dieser Lektion fürderhin ein System an, welches ein Dezimalkomma verwendet.
Runden auf ein gewünschte Anzahl von Nachkommastellen
Die Formatierung mit einem Exemplar der Klasse »java.text.DecimalFormat« erlaubt, es mit dem Platzhalter »0« zu verlangen, daß Stellen, die sonst leer bleiben würden, eine »0« erhalten, so daß bei Verwendung des Formatspezifizierers »0.00« die Zahl 3 durch den Text »3,00« dargestellt wird. Wenn nicht alle Nachkommastellen dargestellt werden sollen, so wird auf die gewünschte Stellenzahl gerundet.
Kein rechtsbündiges Ausrichten möglich
Durch Verwendung von Platzhaltern können Zahlen nicht rechtsbündig ausgerichtet werden.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ final java.text.DecimalFormat twoDigits =
new java.text.DecimalFormat( "##,###.00" );
System.out.println( twoDigits.format( 3 ));
System.out.println( twoDigits.format( 30 ));
System.out.println( twoDigits.format( 300 ));
System.out.println( twoDigits.format( 3000 ));
System.out.println( twoDigits.format( 30000 )); }}transcript
3.00
30.00
300.00
3,000.00
30,000.00
Die Formatierungszeichen
»0« eine Ziffer
»#« eine Ziffer, Nullen werden unter Umständen nicht dargestellt
».« das Dezimaltrennzeichen (immer)
»,« das Gruppierungszeichen (immer)
»-« ein eventuelles negatives Vorzeichen
»E« Das »E« für Formatierung in E-Schreibweise (wie 2E3)
»%« Verlangt Darstellung als Prozentwert
Jedes andere Zeichen kann direkt oder nach einem Apostroph verwendet werden.
Einstellen eines bestimmten Schauplatzes
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ final java.text.DecimalFormatSymbols germany
= new java.text.DecimalFormatSymbols( java.util.Locale.GERMANY ); final java.text.DecimalFormatSymbols usa
= new java.text.DecimalFormatSymbols( java.util.Locale.US ); final java.text.DecimalFormat german
= new java.text.DecimalFormat( "##,###.00", germany ); final java.text.DecimalFormat us
= new java.text.DecimalFormat( "##,###.00", usa ); System.out.println( german.format( 30000 )); System.out.println( us.format( 30000 )); }}transcript
30.000,00
30,000.00Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ final java.text.DecimalFormatSymbols germany
= new java.text.DecimalFormatSymbols( new java.util.Locale( "de", "DE" )); final java.text.DecimalFormatSymbols usa
= new java.text.DecimalFormatSymbols( new java.util.Locale( "en", "US" )); final java.text.DecimalFormat german
= new java.text.DecimalFormat( "##,###.00", germany ); final java.text.DecimalFormat us
= new java.text.DecimalFormat( "##,###.00", usa ); System.out.println( german.format( 30000 )); System.out.println( us.format( 30000 )); }}transcript
30.000,00
30,000.00
Formatierung mit »java.text.NumberFormat«
Die Klasse »java.text.NumberFormat« erlaubt es, ein Minimum und ein Maxium für Stellenanzahlen festzulegen.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ final java.text.NumberFormat f =
java.text.NumberFormat.getInstance();
/* getInstance( java.util.Locale.GERMAN ) */ f.setMinimumFractionDigits( 2 );
f.setMaximumFractionDigits( 2 );
java.lang.System.out.println( f.format( -1234.56789 ));
// -1.234,57 f.setMinimumFractionDigits( 10 );
f.setMaximumFractionDigits( 10 );
java.lang.System.out.println( f.format( -1234.56789 ));
// -1.234,5678900000 f.setMinimumFractionDigits( 0 );
f.setMaximumFractionDigits( 2 );
java.lang.System.out.println( f.format( -1234.56789 ));
// -1.234,57 f.setMinimumFractionDigits( 0 );
f.setMaximumFractionDigits( 10 );
java.lang.System.out.println( f.format( -1234.56789 ));
// -1.234,56789 f.setMinimumIntegerDigits( 2 );
f.setMaximumIntegerDigits( 2 );
java.lang.System.out.println( f.format( -1234.56789 ));
// -34,56789 f.setMinimumIntegerDigits( 10 );
f.setMaximumIntegerDigits( 10 );
java.lang.System.out.println( f.format( -1234.56789 ));
// -0.000.001.234,56789 f.setMinimumIntegerDigits( 0 );
f.setMaximumIntegerDigits( 2 );
java.lang.System.out.println( f.format( -1234.56789 ));
// -34,56789 f.setMinimumIntegerDigits( 0 );
f.setMaximumIntegerDigits( 10 );
java.lang.System.out.println( f.format( -1234.56789 ));
// -1.234,56789 }}transcript
-1.234,57
-1.234,5678900000
-1.234,57
-1.234,56789
-34,56789
-0.000.001.234,56789
-34,56789
-1.234,56789transcript
-1,234.57
-1,234.5678900000
-1,234.57
-1,234.56789
-34.56789
-0,000,001,234.56789
-34.56789
-1,234.56789
Das folgende Beispielprogramm zeigt die Formatierung einer Tabelle, welche sicherstellt, daß immer zwei Nachkommastellen ausgegeben werden.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ final java.text.NumberFormat formatter =
java.text.NumberFormat.getNumberInstance();
/* getInstance( java.util.Locale.GERMAN ) */
double saldo = 1000;
formatter.setMinimumFractionDigits( 2 );
formatter.setMaximumFractionDigits( 2 );
for( int i = 0; i < 10; ++i )
{ final java.lang.String saldoString = formatter.format( saldo );
for( int j = saldoString.length(); j < 10; ++j )
java.lang.System.out.print( ' ' );
java.lang.System.out.println( i + " " + saldoString );
saldo *= 1.05; }}}transcript
0 1,000.00
1 1,050.00
2 1,102.50
3 1,157.62
4 1,215.51
5 1,276.28
6 1,340.10
7 1,407.10
8 1,477.46
9 1,551.33
Rundung mit »java.math.BigDecimal«
Die Klasse »java.math.BigDecimal« enthält Möglichkeiten zur Rundung von Zahlen. Der Modus »java.math.BigDecimal.ROUND_HALF_UP« verlangt Rundung zum nächstliegenden Wert mit der angegebenen Stellenzahl und Aufrundung, falls dabei mehrere Werte in Frage kommen.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( ( ( new java.math.BigDecimal( "1234.5678" )).
setScale( 2, java.math.BigDecimal.ROUND_HALF_UP ))); }}transcript
1234.57