From 33613a85afc4b1481367fbe92a17ee59c240250b Mon Sep 17 00:00:00 2001
From: Sven Eisenhauer
+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
+und PrintStream
+zur Verfügung steht. Letztere besitzt als Remineszenz an C/C++
+sogar eine Methode printf
+mit gleicher Funktionalität. 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:
+
+
+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:
+
+
+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:
+
+
+
+
+
+
+ Titel
+ Inhalt
+ Suchen
+ Index
+ DOC
+ Handbuch der Java-Programmierung, 5. Auflage
+
+ <<
+ <
+ >
+ >>
+ API
+ Kapitel 11 - Strings
+
+
+
+
+
+11.6 Ausgabeformatierung
+
+
+
+
+
+
+
+11.6.1 Grundlagen
+
+
+
+
+
+
+
+
+![]()
+
+![]()
+
+
+
+![]()
+
+
+
+
+
+ JDK1.1-6.0
+
+
+
+
+
+
+
+
+
+
+static String format(Locale l, String format, Object... args)
+
+static String format(String format, Object... args)
+
+
+
+java.util.Formatter
+
+
+
+
+
+
+
+
+
+ % [Argument-Index$][Flags][Width][.Precision]Conversion
+
+
+
+
+
+Listing 11.6: Formatierte Zahlenausgabe
+
+
+
+
+
+001 /* Listing1106.java */
+002
+003 public class Listing1106
+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 }
+
+
+Listing1106.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-Objektes +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 /* Listing1107.java */
+002
+003 import java.util.*;
+004
+005 public class Listing1107
+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 }
+
+ |
++Listing1107.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, 5. Auflage, Addison +Wesley, Version 5.0.1 + |
| << + | < + | > + | >> + | API + | © 1998, 2007 Guido Krüger & Thomas +Stark, http://www.javabuch.de + |