Titel   Inhalt   Suchen   Index   DOC  Handbuch der Java-Programmierung, 7. Auflage
 <<    <     >    >>   API  Kapitel 12 - Strings

12.6 Ausgabeformatierung



12.6.1 Grundlagen

C-Programmierer vermissen in Java schon länger eine bequeme und flexible Möglichkeit, elementare Datentypen formatiert auszugeben. Während Methoden wie toString oder println zwar bequem in der Anwendung sind, bieten sie kaum Möglichkeiten, die Formatierung der Ausgabe gezielt zu beeinflussen. Und die seit dem JDK 1.2 vorhandenen Klassen im Paket java.text sind zwar flexibel und mächtig, aber oft umständlich in der Anwendung und nicht ganz einfach zu verstehen.

Seit der J2SE 5.0 gibt es die Klasse java.util.Formatter, deren Möglichkeiten der printf-Funktion in C und C++ ebenbürtig sind. Sie bietet die Möglichkeit, alle primitiven Datentypen und ihre Wrapper, sowie Datums-/Zeitwerte der Klassen Calendar und Date in vielfältiger Weise (auch länderspezifisch) formatiert auszugeben. Prinzipiell muss dazu ein Formatter-Objekt instanziert und dessen Ausgabemethode format aufgerufen werden. Einfacher wird es dadurch, dass format mit all seinen Möglichkeiten auch in den Klassen String, PrintWriter und PrintStream zur Verfügung steht. Letztere besitzt sogar eine Methode printf, deren Funktionalität weitgehend der gleichnamigen Funktion aus C/C++ entspricht (siehe Listing 19.4). Wir wollen uns auf die Klassen String und das Objekt System.out konzentrieren, die übrigen Stellen funktionieren in der gleichen Weise.

Die Methode format gibt es in zwei Varianten:

static String format(Locale l, String format, Object... args)

static String format(String format, Object... args)
java.util.Formatter

Bei der ersten Form kann explizit angegeben werden, welche Sprach- bzw. Ländereinstellung verwendet werden soll, bei der zweiten wird die Default-Locale verwendet. Der Parameter format dient zur Übergabe eines Formatstrings, die übrigen Parameter sind dessen Argumente. Der Formatstring besteht aus Formatangaben und festem Text. Die Formatangaben beginnen mit einem Prozentzeichen und enden mit einem Konvertierungszeichen. Dazwischen können weitere Optionen enthalten sein. Insgesamt sieht die Syntax so aus:

  % [Argument-Index$][Flags][Width][.Precision]Conversion

Der Formatstring wird von links nach rechts ausgegeben. Zu jeder Formatangabe muss es einen Parameter geben, dessen Wert entsprechend formatiert ausgegeben wird. Alle übrigen Teile des Formatstrings werden als fester Text angesehen und unverändert ausgegeben. Das folgende Listing zeigt ein einfaches Beispiel:

001 /* Listing1206.java */
002 
003 public class Listing1206
004 {
005   public static void main(String[] args)
006   {
007     for (int i = 5; i < 199; i += 37) {
008       System.out.format("Aktueller Wert: %3d%n", i);
009     }
010   }
011 }
Listing1206.java
Listing 12.6: Formatierte Zahlenausgabe

Die Ausgabe der Methode ist:

Aktueller Wert:   5
Aktueller Wert:  42
Aktueller Wert:  79
Aktueller Wert: 116
Aktueller Wert: 153
Aktueller Wert: 190

An format werden zwei Parameter übergeben: der Formatstring "Aktueller Wert: %3d%n" und die Schleifenvariable i. Der Formatstring enthält den konstanten Text "Aktueller Wert: ", der unverändert ausgegeben wird, sowie die beiden Formatangaben "%3d" und "%n". Die erste gibt an, dass das nächste Argument als Ganzzahl mit einer Feldbreite von drei Stellen ausgegeben werden soll. Die zweite steht als Platzhalter für eine Zeilenschaltung.

12.6.2 Die Formatangaben

Auf diese Weise können auch sehr komplexe Ausgabeformatierungen erzeugt werden. Dazu wollen wir uns die Bestandteile einer Formatangabe etwas genauer ansehen.

Weitere Details, Möglichkeiten und Einschränkungen werden in der sehr ausführlichen API-Dokumentation der Klasse java.util.Formatter beschrieben. Das folgende Listing zeigt noch einmal alle besprochenen Möglichkeiten im Überblick:

001 /* Listing1207.java */
002 
003 import java.util.*;
004 
005 public class Listing1207
006 {
007   public static void main(String[] args)
008   {
009     //Boolesche Werte
010     System.out.format("%b %b %2$b %1$b%n", true, false);
011     //Ganzzahlen
012     System.out.format("[%d]%n", -2517);
013     System.out.format("[%7d]%n", -2517);
014     System.out.format("[%-7d]%n", -2517);
015     System.out.format("[%(7d]%n", -2517);
016     System.out.format("[%07d]%n", -2517);
017     System.out.format("[%,7d]%n", -2517);
018     System.out.format("%1$d %<o %<x %<X%n", 127);
019     //Fließkommazahlen
020     System.out.format("%f%n", 0.000314);
021     System.out.format("%1$6.2f %1$6.2e %1$6.2E %1$6.2G%n", 3.141592);
022     System.out.format("%,8.2f%n", 31415.92);
023     System.out.format(Locale.ENGLISH, "%,8.2f%n", 31415.92);
024     //Zeichen und Strings
025     System.out.format("%c%c%c\n", 97, 64, 98);
026     System.out.format("%s nein\n", "ja");
027     //Datum/Uhrzeit
028     Calendar now = Calendar.getInstance();
029     System.out.format(
030       "%1$td.%1$tm.%1$tY %1$tH:%1$tM:%1$tS%n",
031       now
032     );
033     System.out.format("%tF%n", now);
034     System.out.format("%tc%n", now);
035   }
036 }
Listing1207.java
Listing 12.7: Formatierte Ausgabe

Seine Ausgabe ist:

true false false true
[-2517]
[  -2517]
[-2517  ]
[ (2517)]
[-002517]
[ -2.517]
127 177 7f 7F
0,000314
  3,14 3.14e+00 3.14E+00    3.1
31.415,92
31,415.92
a@b
ja nein
02.10.2004 21:38:24
2004-10-02
Sa Okt 02 21:38:24 CEST 2004

 Titel   Inhalt   Suchen   Index   DOC  Handbuch der Java-Programmierung, 7. Auflage, Addison Wesley, Version 7.0
 <<    <     >    >>   API  © 1998, 2011 Guido Krüger & Heiko Hansen, http://www.javabuch.de