Print F
Java unterstützt mit der Version 1.5 nun auch formatierte Ausgaben wie beispielsweise in C die Funktion sprintf es tut. Die neue Funktionalität wird realisiert duch java.util.Formatter, und dort befindet sich auch die Dokumentation. Allerdings gibt es mit java.io.PrintWriter#printf(), java.io.PrintWriter#format(..) und java.lang.String#format(..) Komfortmethoden, die recht einfach zu handhaben sind. Wir wollen die Funktionalität im folgenden vorstellen.
Habe wir einen Text s oder eine Zahl d, so lassen sich diese mit printf einfach in einer Zeichenkette ausgeben. Das Prozentzeichen fungiert als Escape-Character und leitet eine Formatierungssequenz ein, im einfachsten Fall ein "s" für eine Zeichenkette und ein "f" für eine Dezimalzahl. "%n" bewirkt einen Zeilenumbruch:
String s="HIER DER FORMATIERTE TEXT";
double d=10000.11;
// Einfache Ausgabe
System.out.printf("start %s mitte %f ende%n",s,d);
// => start HIER DER FORMATIERTE TEXT mitte 10000,110000 ende
Die entsprechenden Werte werden als Variablen hinter die Zeichenkette geschrieben, wobei die Anzahl variieren kann. Die Reihenfolge der Variablen folgt der Reihenfolge in der Zeichenkette vorn, kann allerdings auch explizit angegeben werden:
// Reihenfolge der Argumente tauschen
System.out.printf("start %2$f mitte %1$s nochmal: %1$s ende%n",s,d);
// => start 10000,110000 mitte HIER DER FORMATIERTE TEXT nochmal: HIER DER FORMATIERTE TEXT ende
Oft ist es erforderlich, eine feste Spaltenbreite bei der Ausgabe zu erreichen. Auch das ist nun möglich, indem die gewünschte Mindestbreite vor dem Punkt und die Maximalzahl der auszugebenden Zeichen nach dem Punkt angegeben angegeben werden. Wie man sieht, werden Zahlen nicht gekürzt, wenn die verfügbare Breite nicht ausreicht:
// Feste Breite
System.out.printf("start %10.2f mitte %10.2s ende%n",d ,s );
// => start 10000,11 mitte HI ende
Standardmäßig wird diese Ausgabe rechts ausgerichtet. Möchte man links ausrichten, so hilft ein führendes "-" Minuszeichen:
// Linksausrichtung
System.out.printf("start %2$-10.2f mitte %1$-10.2s ende%n",s ,d );
// => start 10000,11 mitte HI ende
Für Dezimalzahlen werden noch weitere Vorteile geboten: Das Zahlenformat kann selbstverständlich lokalisiert angegeben werden:
// Lokale System.out.printf(Locale.ENGLISH, "start %10.2f ende%n",d); // => start 10000.11 ende
Die Lesbarkeit der Ausgabe läßt sich durch ein führendes Komma "," verbessern:
// Dezimalstellen
System.out.printf("start %,10.2f %n",d);
// => start 10.000,11
Duch ein Plus - Zeichen "+" läßt sich die Ausgabe des Vorzeichens erzwingen:
// Vorzeichen erzwingen
System.out.printf("start %+10.2f %n",d);
// => start +10000,11
Beide (Plus und Komma) können auch gemeinsam verwendet werden. Die verfügbare Breite kann auch mit Nullen ausgefüllt werden, falls dies erforderlich ist:
// füllen mit Null
System.out.printf("start %010.4f %n",d);
// => start 10000,1100
Schließlich können wir auch ein Hexadezimal-Darstellung bekommen:
// Hexadezimalausgabe
System.out.printf("start %H %n",31);
// => start 1F
Für Zeichenketten ist die Umwandlung in Großbuchstaben interessant. Hierzu wird einfach ein großes statt eines kleinen "s" verwendet:
// Großbuchstaben
System.out.printf("start %S %n","klein");
// => start KLEIN
Zeitangaben lassen sich ebenfalls formatieren. Besonders interessant ist dabei die Möglichkeit, einen Timestamp (long - Wert) ohne Umwandlung in ein Datum direkt als Datum oder Uhrzeit auszugeben.
// Datum und Zeit
System.out.printf("Zeit: %tF %tT %n", new Date(), System.currentTimeMillis());
// => Zeit: 2008-02-18 00:06:40
Die Formatierungsmöglichkeiten für Datum und Uhrzeit sind noch wesentlich umfangreicher. Einzelheiten gibts in der Java-Dokumentation der Klasse java.util.Format.