Home > Code > Java > Print F

Print F

Geschrieben von admin on February 17, 2008

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.

Comments:

Sie müssen angemeldet sein um eine Nachricht zu erstellen. Anmelden »