Inhaltsverzeichnis ------------------------------------------------------------------------------------------------------- 1. Was leisten die printf-Methoden? 7. Struktur eines Formatstrings 13. Zeichen 2. Erste Schritte mit dem PrintfApplet 8. Struktur eines Umwandlungsbefehls 14. Zeitwerte 3. Schalter 9. Mindestbreite 15. Umwandlungsbuchstaben 4. Datums- und Zeitangaben 10. Genauigkeit 16. Zusatzbuchstabe 5. Lokalitäten (Locale-Objekte) 11. Ganzzahlen 17. Über das PrintfApplet 6. Den Formatstring direkt editieren 12. Bruchzahlen -------------------------------------------------------------------------------------------------------
Mit den Methoden namens System.out.printf kann man Daten formatieren und ausgeben. Formatieren kann hier z. B. Folgendes bedeuten:
Die Daten (durch das Anhängen von Füllzeichen) auf eine bestimmte Mindestbreite verlängern.
Derart verlängerte Daten linksbündig oder rechtsbündig ausrichten (d. h. die Füllzeichen rechts bzw. links anhängen).
Bruchzahlen mit einer bestimmten Anzahl von Nachpunktstellen ausgeben (nachdem die Zahl gerundet wurde)
Ganzzahlen im 10-er-System (als Dezimalzahlen), im 8-er-System (als Oktalzahlen) oder im 16-er-System (als Hexadezimalzahlen) ausgeben.
Von einem Calendar-Objekt (welches eine vollständige Datums-und-Zeit-Angabe enthält) bestimmte Teilinformationen ausgeben, z.B. nur die Minute oder die vollständige Zeitangabe (Stunde, Minute, Sekunde) oder nur das Datum oder das Datum und die vollständige Zeitangabe etc.
Als Füllzeichen werden normalerweise Blanks (' ') verwendet (wegen Ausnahmen siehe Schalter 0). In den folgenden Beispielen werden in der Spalte Ausgabe Füllzeichen nicht durch Blanks, sondern durch grau hinterlegte Punkte ('.') dargestellt, damit man sie besser erkennen und zählen kann. Anstelle des langen Namens System.out.printf wird nur der Kurzname printf notiert.
Beispiele:
printf-Befehl | Ausgabe | Kommentar |
printf("Insg. %d Euro %d Cent", 15, 20); printf("%5d Euro", 123); printf("%8d Dollar", 123); printf("%-8d Cent", 123); printf("%3d $", 12345); printf("Nr. %d", 255); printf("Nr. %o", 255); printf("Nr. %h", 255); printf("Euro %.2f", 34.565); printf("Euro %7.2f", 34.564); printf("%5tT", new Calendar()); printf("%5tF", new Calendar()); |
Insg. 15 Euro 20 Cent ..123 Euro .....123 Dollar 123..... Cent 12345 $ Nr. 255 Nr. 377 Nr. ff Euro 34.57 Euro ..34.56 19:47:19 2004-10-09 |
dezimal Mindestbreite 5, dezimal Mindestbreite 8, dezimal linksbündig, Mindestbreite 8, dezimal Mindestbreite 3 (tatsäch. Breite 5) dezimal oktal hexadezimal 2 Nachpunktstellen Mindestbreite 7, 2 Nachpunktstellen Std:Min:Sek Jahr-Monat-Tag |
Das PrintfApplet führt immer den print-Befehl aus, der im Textfenster printf-Befehl angezeigt wird. Dieser Befehl formatiert den Wert einer Variablen namens dora und gibt ihn aus. Der Benutzer kann wählen bzw. eingeben:
Den Typ der Variablen dora.
Den Wert der Variablen dora.
Den Formatstring des printf-Befehls.
Zu Beginn empfiehlt es sich, folgende Fragen in der angegebenen Reihenfolge zu beantworten:
Zu welchem Typ soll die Variable dora gehören? Klicken Sie einen entsprechenden Typenknopf an (im obersten Rahmen mit Knöpfen).
Welchen Wert soll die Variable dora haben? Geben Sie ein entsprechendes Literal in das Textfenster Wert von dora ein. String- und char-Literale müssen ohne Anführungszeichen eingegeben werden.
Wählen Sie einen Umwandlungsbuchstaben für den Formatstring, indem Sie einen entsprechenden Knopf anklicken. Mit diesem Buchstaben legen Sie die Formatierung weitgehend fest. Bestimmte Umwandlungsbuchstaben vertragen sich nur mit Werten bestimmter Typen. Z.B. kann man die Buchstaben s, b und h auf Daten aller Typen anwenden, die Buchstaben c und C aber nur auf char- und Character-Werte. Wenn Sie einen unverträglichen Buchstaben anklicken, erscheint im Textfenster Ausgabe eine entsprechende Fehlermeldung und Sie sollten einen anderen Umwandlungsbuchstaben probieren.
Legen Sie eine Mindestbreite und Genauigkeit fest (mit den entsprechend beschrifteten Zahlen-Eingabefenstern). Wenn Sie die Zahl -1 wählen oder eingeben, wird keine Zahl in den Formatstring des printf-Befehls übernommen.
Beispiel 1: 1. Wählen Sie den Typ byte (durch Anklicken des entsprechenden Knopfes im Rahmen Typ von dora). 2. Geben Sie im Textfenster Wert das Literal 123 ein. 3. Wählen Sie als Umwandlungsbuchstaben d (im Rahmen Umwandlungsbuchstaben (für den Formatstring), Unterrahmen Für Ganzzahlen). 4. Wählen Sie als Mindestbreite 5 und als Genauigkeit -1 (beim Formatieren von Ganzzahlen darf man keine Genauigkeit angeben).
Beispiel 2: Vergrößern Sie jetzt die Mindestbreite von 5 auf 6, 7, 8 etc. Wählen Sie im Rahmen Schalter (für den Formatstring) das Minuszeichen. Wählen Sie das Minuszeichen mehrmals an und ab und beobachten Sie, wie die Ausgabe sich dadurch verändert.
Beispiel 3: 1. Wählen Sie den Typ float. 2. Geben Sie im Textfenster Wert das Literal 12.3456 ein. 3. Wählen Sie den Umwandlungsbuchstaben f. 4. Wählen Sie als Mindestbreite 8 und als Genauigkeit 5. Vermindern Sie dann die Genauigkeit auf 4, 3, 2, 0, -1 und beobachten Sie, wie die Ausgabe sich dadurch verändert.
Es gibt insgesamt sieben Schalterzeichen, von denen man im Prinzip beliebig viele (0 bis 7) auswählen kann. Allerdings vertragen sich bestimmte Schalter nicht miteinander oder nicht mit bestimmten Typen oder nicht mit bestimmten Umwandlungsbuchstaben. Wenn Sie unverträgliche Schalter wählen, erscheint im Textfenster Ausgabe eine entsprechende Fehlermeldung. Die Schalter müssen (in beliebiger Reihenfolge) unmittelbar nach dem Prozentzeichen % am Anfang eines Umwandlungsbefehls und vor allen weiteren Angaben stehen. Sie haben meistens die folgenden Wirkungen:
Schalter | Wirkung |
+ | (Ein Pluszeichen) Positive Zahlen beginnen mit +, negative mit -. |
( | (Eine öffnende runde Klammer) Positive Zahlen erscheinen ohne Vorzeichen, negative erscheinen in runde Klammern eingefasst. |
' ' | (Ein Blankzeichen) Positive Zahlen beginnen mit einem Blankzeichen, negative mit -. |
- | (Ein Minuszeichen) Daten werden linksbündig ausgerichtet (nur sinnvoll, wenn im Formatstring gleichzeitig eine Mindestbreite angegeben wurde). |
0 | (Eine Null) Zum Verlängern von Daten auf die Mindestbreite werden (anstelle der normalen Blankzeichen) Nullen genommen. |
, | (Ein Komma) Die Vorpunktstellen von Zahlen werden 'gruppiert' d.h. 3er-Gruppen von Ziffern werden durch ein spezielles Zeichen voneinander getrennt. Das Zeichen ist abhängig von der Lokalität. |
# | (Ein Nummernzeichen) Die Daten werden auf eine 'alternative' Weise formatiert. Dieser Schalter hat nur in wenigen Fällen eine Wirkung (z.B. zusammen mit den Umwandlungsbuchstaben x, X, o und O für Ganzzahlen). |
Mit den Umwandlungsbuchstaben t und T (wie time) kann man Werte der Typen Calendar, long und Long als Datums- und Zeitangaben formatieren. Werte der Typen long und Long werden dabei als die Anzahl der Millisekunden interpretiert, die seit dem 01.01.1970 (dem Beginn unserer Epoche) vergangen sind.
Wenn man einen der Umwandlungsbuchstaben t oder T wählt, kann (und muss) man auch noch einen Zusatzbuchstaben wählen (im Rahmen Zusatzbuchstaben für ... ganz unten im Applet). Mit dem Zusatzbuchstaben legt man fest, welche Teile einer Datums- und Zeitangabe ausgegeben werden sollen. Die entsprechenden Knöpfe sind alle mit ToolTips versehen.
Wenn man als Typ Calendar gewählt hat, darf man als Wert jetzt oder now oder ein Ganzzahlliteral in das Textfenster Wert eingeben. Die Worte bezeichnen ein Calendar-Objekt, welches den aktuellen Zeitpunkt (jetzt!) beschreibt. Ganzzahlliterale werden als long-Werte eingelesen und dann formatiert.
Die Formatierung von Datums- und Zeitangaben ist abhängig von der Lokalität (siehe die Knöpfe im Rahmen Lokalitäten des Applets).
Es gibt zwei Methoden namens System.out.printf mit folgenden Profilen:
1. System.out.printf(String formatString, Object... zuFormatierendeParameter);
2. System.out.printf(Locale lokal, String formatString, Object... zuFormatierendeParameter);
Ein Locale-Objekt beschreibt unter anderem die speziellen Bräuche (eines Landes oder einer Region) für das Formatieren von Zahlen und von Datums- und Zeitangaben.
Mit den entsprechenden Knöpfen kann man eine bestimmte Lokalität (z.B. Italy oder Germany oder US etc.) wählen. Es wird dann die zweite printf-Methode mit dem entsprechenden Locale-Objekt aufgerufen. Wenn man den Knopf ohne lokal wählt, wird die erste printf-Methode (die ohne Locale-Parameter) aufgerufen.
Unterschiede zwischen verschiedenen Lokalitäten kann man z.B. in den folgenden Fällen beobachten:
Beim Formatieren von Zahlen. Probieren Sie z.B. den Wert 12345678 vom Typ int, den Umwandlungsbuchstaben d, den Schalter Komma ',' (zum Gruppieren der Vorpunktstellen), die Genauigkeit -1 und nacheinander die Lokalitäten ohne lokal, Germany und France.
Beim Formatieren von Datums- und Zeitangaben. Probieren Sie z.B. den Wert jetzt, den Typ Calendar, den Umwandlungsbuchstaben t, den Zusatzbuch- staben c und die Lokalitäten ohne lokal, Germany, Italy und France. Die Lokalitäten Japan und Korea funktionieren nur dann vollständig, wenn man einen Unicode-Font installiert hat (weil Japanische/Chinesische bzw. Koreanische Zeichen ausgegeben werden müssen).
Im Textfenster printf-Befehl wird immer der aktuelle printf-Befehl (der gerade ausgeführt wurde) angezeigt. Normalerweise verändert man den Formatstring in diesem printf-Befehl indirekt, indem man verschiedene Knöpfe anklickt. Man kann den Formatstring aber auch (im Textfenster printf-Befehl) direkt editieren. Dazu muss man den Wahlknopf Formatstring ... direkt editieren (etwa in der Mitte des Fensters links) anklicken. Man darf dann aber nur den Formatstring verändern (den Text zwischen den doppelten Anführungszeichen), die übrigen Teile des printf-Befehls sind gegen Veränderungen geschützt.
Achtung: Wenn man den Formatstring direkt editiert hat und dann den Knopf Formatstring ... direkt editieren wieder abwählt, gehen alle Änderungen verloren (weil der Formatstring wieder durch den Zustand zahlreicher Knöpfe und Zahlen-Eingabefenster bestimmt wird).
Beispiel: Geben Sie eine Ganzzahl wie 123 in das Textfenster Wert ein, wählen Sie den Umwandlungsbuchstaben d, eine Mindestbreite von -1 und eine Genauigkeit ebenfalls von -1. Wählen Sie dann Formatstring ... direkt editieren und editieren Sie den Formatstring im printf-Befehl wie folgt:
printf("%d %<x %<o", dora);
Die Zahl 123 sollte dann dreimal nacheinander ausgegeben werden, erst im 10-er-System (dezimal), dann im 16-er-System (hexadezimal) und dann im 8-er-System (oktal), etwa so:
123 7b 173
Beim Aufrufen einer printf-Methode muss man mindestens einen Parameter vom Typ String angeben, einen sogenannten Formatstring. Ein Formatstring besteht aus beliebig vielen (0 oder mehr) Umwandlungsbefehlen. Zwischen den Umwandlungsbefehlen (und vor dem ersten und nach dem letzten Umwandlungsbefehl) dürfen beliebige Textstücke beliebiger Länge (0 oder mehr Zeichen) stehen. Im einfachsten Fall besteht ein Formatstring nur aus einem beliebigen Text (ohne Umwandlungsbefehle darin). Ein Umwandlungsbefehl beginnt immer mit einem Prozentzeichen % und endet mit einem speziellen Umwandlungsbuchstaben (wie z.B. d oder f) oder einem Zusatzbuchstaben (wie z.B. B oder c). Normalerweise wird der n-te Umwandlungsbefehl im Formatstring auf den n-ten zusätzlichen Parameter (hinter dem Formatstring angewendet). In der Ausgabe eines printf-Befehls erscheinen anstelle der Umwandlungsbefehle die entsprechend umgewandelten Parameter.
Beispiel 1: "Endpreis: %d Euro %d Cent" (Textstücke "Endpreis ", " Euro " und " Cent", Umwandlungsbefehle %d und %d)
Beispiel 2: "%5d Euro %2d Cent ist zu viel!" (Textstücke " Euro " und " Cent ist zu viel!", Umwandlungsbefehle %5d und %2d)
Es gibt zwei besondere Textstücke. Das Textstück "%%" bezeichnet eine einzelnes Prozentzeichen (welches nicht als Beginn eines Umwandlungsbefehls interpretiert wird). Das Textstück "%n" bezeichnet eine Zeilenendemarkierung (je nach Plattform ein CR-Zeichen oder ein LF-Zeichen ein CR-Zeichen und ein LF-Zeichen).
Achtung: Das PrintfApplet formatiert immer nur den Wert einer Variablen namens dora. Deshalb darf der Formatstring des printf-Befehls normalerweise nur einen Umwandlungsbefehl enthalten. Im Abschnitt 6. Den Formatstring direkt editieren findet man eine Ausnahme zu dieser Regel.
Der Formatstring eines printf-Befehls darf beliebig viele (0 oder mehr) Umwandlungsbefehle enthalten. Ein Umwandlungsbefehl hat folgende Struktur:
%[Schalter][Mindestbreite][.Genauigkeit]Umwandlungsbuchstabe[Zusatzbuchstabe]
Die in eckige Klammern eingefassten Angaben sind optional. Nur ein Prozentzeichen und einen Umwandlungsbuchstaben muss man in jedem Fall angeben.
Die Mindestbreite ist ein optionaler Teil eines Umwandlungsbefehls. Die Mindestbreite ist eine Ganzzahl größer oder gleich 1 (0 ist nicht erlaubt!). Eine Mindestbreite m legt Folgendes fest: Falls das rohe Umwandlungsergebnis aus weniger als m Zeichen besteht, wird es durch Anfügen von Füllzeichen auf die Mindestbreite m verlängert. Falls das rohe Umwandlungsergebnis bereits aus m oder mehr Zeichen besteht, wird es nicht verändert.
Normalerweise wird das Blankzeichen (' ') als Füllzeichen verwendet. Mit dem Schalter 0 kann man die Ziffer 0 als Füllzeichen festlegen.
Normalerweise wird ein zu verlängernder Wert rechtsbündig ausgerichtet (d.h. die Füllzeichen werden links angefügt). Mit dem Schalter Minus ('-') kann man bewirken, dass der Wert linksbündig ausgerichtet wird (d.h. dass die Füllzeichen rechts angefügt werden).
Die Genauigkeit ist ein optionaler Teil eines Umwandlungsbefehls. Die Genauigkeit besteht aus einem Punkt ('.'), gefolgt von einer Ganzzahl größer oder gleich 0.
Bei Bruchzahlen legt eine Genauigkeit g fest, fass die Zahl mit g Nachpunktstellen formatiert (und voher auf g Nachpunktstellen gerundet) werden soll. Wenn man Ganzzahlen mit den Umwandlungsbuchstaben d, o, x oder X formatiert, darf man keine Genauigkeit angeben (Ganzzahlen haben keine Nachpunktstellen).
Im Zusammenhang mit den Umwandlungsbuchstaben s und S (wie String) legt eine Genauigkeit g fest, dass höchstens die ersten g Zeichen des rohen Ergebnisses verwendet (und die übrigen Zeichen weggeworfen) werden sollen. Falls das rohe Ergebnis nur aus g oder weniger Zeichen besteht, werden alle Zeichen verwendet.
Beispiel 1: Wenn man die Ganzzahl 12345 mit dem Formatstring "%.3s" formatiert, ist das Ergebnis gleich 123.
Beispiel 2: Wenn man die Bruchzahl 23456.78 mit dem Formatstring "%.3s" formatiert, ist das Ergebnis gleich 234.
Beispiel 3: Wenn man den String "abcde" mit dem Formatstring "%.3" ausgibt, ist das Ergebnis gleich abc.
Wenn man den Umwandlungsbuchstaben s oder S mit einer Mindestbreite m und einer Genauigkeit g kombiniert, wird zuerst die Genauigkeit und dann die Mindestbreite angewendet, d. h. vom rohen Umwandlungsergebnis werden höchstens die ersten g Zeichen genommen und durch Anfügen von Füllzeichen auf die Mindestbreite m verlängert.
Beispiel 4: Wenn man die Bruchzahl 23456.78 mit dem Formatstring "%9.3s" formatiert, ist das Ergebnis gleich 234...... .
Beispiel 5: Wenn man die Bruchzahl 23456.78 mit dem Formatstring "%9.3f" formatiert, ist das Ergebnis gleich 23456.780.
Als Ganzzahlen gelten Werte der Typen byte, Byte, short, Short, int, Integer, long, Long und BigInteger. Werte der Typen char und Character gelten nicht als Ganzzahlen (sondern als Zeichen). Ganzzahlen kann man mit den Umwandlungsbuchstaben d, o, x und X (und mit den universellen Umwandlungsbuchstaben b, B, h, H, s und S) formatieren.
Als Bruchzahlen gelten Werte der Typen float, Float, double, Double und BigDecimal. Bruchzahlen kann man mit den Umwandlungsbuchstaben a, A, e, E, f, g und G (und mit den universellen Umwandlungsbuchstaben b, B, h, H, s und S) formatieren. Einen Umwandlungsbuchstaben F gibt es nicht!
Als Zeichen gelten Werte der Typen char und Character. Werte der Typen String und StringBuilder gelten nicht als Zeichen. Zeichen kann man mit den Umwandlungsbuchstaben c und C (und mit den universellen Umwandlungsbuchstaben b, B, h, H, s und S) formatieren.
Als Zeitwerte gelten die Werte der Typen Calendar, long und Long. Zeitwerte kann man mit den Umwandlungsbuchstaben t und T formatieren. Jeder Zeitwert beschreibt ein Datum und einen Zeitpunkt (Jahr, Monat, Tag, Stunde, Minute, Sekunde, Millisekunde). Wenn man Werte der Typen long oder Long als Zeitwerte (d.h. mit t oder T) formatiert, werden sie als die Anzahl der Millisekunden interpretiert, die seit dem 1. Januar 1970 vergangen sind. Dieses Datum gilt als der Beginn unserer Epoche. Zeitpunkte vor unserer Epoche werden durch negative, Zeitpunkte innerhalb unserer Epoche durch positive long-Werte beschrieben.
Nach dem Umwandlungsbuchstaben t bzw. T muss man immer einen Zusatzbuchstaben angeben.
Jeder Umwandlungsbefehl im Formatstring eines printf-Befehls beginnt mit einem Prozentzeichen % und endet mit einem Umwandlungsbuchstaben wie S, d oder f etc. Die folgenden Beispiel-Formatstrings enthalten je einen Umwandlungsbefehl: "%S", "%12S", "%d", "%+-12d", "%f", "%+-12.3f".
Es gibt 12 kleine Umwandlungsbuchstaben (b, h, s, c, d, o, x, a, e, f, g und t) und zu fast jedem kleinen auch einen entsprechenden großen Umwandlungsbuchstaben. Von dieser Regel gibt es drei Ausnahmen: Zu d, o und f gibt es keinen entsprechenden großen Umwandlungsbuchstaben.
Ein großer Umwandlungsbuchstabe hat immer eine ganz ähnliche Wirkung wie der entsprechende kleine Umwandlungsbuchstabe, nur dass im Ergebnis alle kleinen Buchstaben durch große ersetzt sind. Es gibt keinen großen Umwandlungsbuchstaben ohne entsprechenden kleinen Umwandlungsbuchstaben.
Beispiel 1: Wenn man String-Wert "abcABC123" mit dem Formatstring "%s" bzw. "%S" formatiert, ist das Ergebnis gleich abcABC123 bzw. ABCABC123.
Beispiel 2: Wenn man den float-Wert 1.5 mit dem Formatstring "%e" bzw. "%E" formatiert, ist das Ergebnis gleich 1.50e+00 bzw. 1.50E+00.
Beispiel 3: Wenn man den long-Wert 0 als Datums-und-Zeitangabe mit dem Formatstring "%tB" bzw. "%TB" formatiert, ist das Ergebnis gleich Januar bzw. JANUAR.
Wenn man einen Zeitwert mit dem Umwandlungsbuchstaben t oder T formatiert, muss man nach dem Umwandlungsbuchstaben immer einen Zusatzbuchstaben angeben. Jeder Zeitwert enthält eine vollständige Datums-und-Zeitangabe. Der Zusatzbuchstabe legt fest, welche Teile dieser Datums-und-Zeitangabe ausgegeben werden sollen, z.B. M (nur die Minute 00 bis 59), Y (nur das Jahr, mindestens 4-stellig), c (eine vollständige Datums- und Zeitangabe wie z.B. So.Okt.10.12:13:43.GMT+01:00.2004)
Beispiel 1: Wenn man in der Zeitzone GMT+01 (eine Stunde später als Greenwich Mean Time) den long-Wert 0 mit dem Formatstring "%tc" formatiert, ist das Ergebnis gleich Do.Jan.01.01:00:00.GMT+01:00.1970 (Donnerstag, 1. Januar, 01 Uhr und 00 Minuten und 00 Sekunden).
Beispiel 2: Wenn man in der Zeitzone GMT+01 den long-Wert -3600000 (d.h. 3600000 Millisekunden gleich eine Stunde vor unserer Epoche) mit dem Formatstring "%tc" formatiert, ist das Ergebnis gleich Do.Jan.01.00:00:00.GMT+01:00.1970.
Beispiel 3: Wenn man in der Zeitzone GMT+01 den long-Wert -3600001 (d.h. 3600001 Millisekunden gleich eine Stunde-und-und-eine-Millisekunde vor unserer Epoche) mit dem Formatstring "%tc" formatiert, ist das Ergebnis gleich Mi.Dez.31.23:59:59.GMT+01:00.1969 (Mittwoch, 31. Dezember, 23 Uhr und 59 Minuten und 59 Sekunden).
Autor: Ulrich Grude
Netzseite: www.tfh-berlin.de/~grude
e-mail: grude@tfh-berlin.de
Verbesserungsvorschläge, Hinweise auf Fehler und (positive und negative) Kritik sind jederzeit willkommen, am liebsten per e-mail. Viel Spaß und Erfolg mit dem PrintfApplet.