Titel | Inhalt | Suchen | Index | DOC | Handbuch der Java-Programmierung, 7. Auflage |
<< | < | > | >> | API | Kapitel 12 - Strings |
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 |
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.
Auf diese Weise können auch sehr komplexe Ausgabeformatierungen erzeugt werden. Dazu wollen wir uns die Bestandteile einer Formatangabe etwas genauer ansehen.
Anders als in C/C++ müssen die Argumente strikt typkonform übergeben werden, was mitunter etwas lästig sein kann. Das Konvertierungszeichen f akzeptiert beispielsweise nur Fließkommazahlen, nicht aber Ganzzahlen; bei d ist es genau umgekehrt.
Einen Sonderstatus haben % und n, die für das Prozentzeichen bzw. die Zeilenschaltung stehen und kein zusätzliches Argument benötigen.
Sollen mit Hilfe des Konvertierungsprefixes t Datums-/Zeitwerte ausgegeben werden, so muss mit einem zweiten Buchstaben direkt dahinter angegeben werden, welcher Teil des Date- oder Calendar-Objekts ausgegeben werden soll. Einige der vielen Möglichkeiten sind:
Mit dem Konvertierungszeichen s können Strings, aber auch andere Objekte ausgegeben werden. Falls das Objekt das Interface java.util.Formattable implementiert, wird dessen Methode formatTo aufgerufen, andernfalls die (stets vorhandene) Methode toString.
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 |
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 |