Stringformatierung in Java lernen mit String.format und printf
Mit String.format in Java Tabulatoren in der Konsole richtig einsetzen und die Anzahl der Kommastellen für Dezimalzahlen bestimmen.Tags: Dezimalstellen | double | Formatierung | Java | Programmieren lernen | String | Tabulatoren | ZeilenumbruchWorum geht´s?
In diesem kleinen Java-Tutorial lernst du die Grundlagen der Stringformatierung in Java mit String.format und printf. Du wirst lernen, wie du in der Java-Konsole Tabulatoren (Abstände) einbaust, und wie du die Kommastellen bei Dezimalzahlen bestimmst.
1. Was ist String.format in Java?
Die Funktion String.format dient in Java – wie der Name schon vermuten lässt – der besseren Formatierung von Strings bei der Ausgabe in der Konsole.
Der Vorteil dabei ist, dass man die Formatierung von einem oder mehreren Werten unabhängig von den konkreten Werten vorformatieren kann. Die jeweiligen Werte/Variablen werden dabei gewissermaßen einfach nachträglich eingesetzt.
1.1 Ein ganz einfaches String.format in Java
Schauen wir uns einfach mal ein einfaches Beispiel der Stringformatierung in Java an:
System.out.println(String.format("Mein Name ist %s.", "Wichtel"));
Diese Code-Zeile würde folgenden Text ausgeben:
„Mein Name ist Wichtel.“
Statt dem %s wird also das Wort „Wichtel“ eingesetzt. Das %-Zeichen sagt Java dabei, dass hier ein Platzhalter für eine Variable steht. Der Buchstabe s steht dabei für den Datentyp String.
Würde man statt einem „Wichtel“-String am Ende z.B. eine Zahl wie 8 einbauen, würde das auch funktionieren, weil unsere Zahl dann automatisch in einen String umgewandelt werden würde.
Aber was, wenn man z.B. eine ganzzahlige Zahl einfügen möchte?
1.2 Arten von Platzhaltern in Java String.format
Dann schreiben wir statt dem %s ein %d in den ersten String:
System.out.println(String.format("Mein Name ist %d.", 8));
Nun wird „Mein Name ist 8.“ ausgegeben.
Würden wir jetzt statt der 8 wieder unseren „Wichtel“-String einfügen, bekommen wir eine Exception (=Fehler in Java):
java.util.IllegalFormatConversionException: d != java.lang.String
Diese sagt uns, dass unser %d (=ganzzahlige Zahl) nicht mit dem String „Wichtel“ zusammenpasst, weil ein String und eine ganzzahlige Zahl nicht dem selben Datentyp entsprechen.
Aber welche Buchstaben können wir nun zu unserem Platzhalter hinzufügen?
Dabei gibt es unzählige Möglichkeiten, und eine ausführliche Liste dazu. Aber hier eine Zusammenfassung der wichtigsten für den Anfang:
- %d: Ganzzahlige Zahl (z.B. int)
- %f: Dezimalzahl (z.B. double)
- %s: String
1.3 Mehrere Platzhalter in Java String.format einfügen
Bisher haben wir ja immer nur einen einzigen Platzhalter in unser String.format eingefügt. Aber wirklich interessant wird es erst, wenn wir mehrere Platzhalter verwenden.
Stell dir z.B. vor, du hast eine Rechnung im Format 3*6 = 18. Die Zahlen 3 und 6 könnten zwei Variablen sein, und die 18 das Ergebnis der Multiplikation. Der Java-Code dazu:
int n1 = 6; int n2 = 3; System.out.println(String.format("%d * %d = %d", n1, n2, (n1*n2)));
Die Ausgabe in der Konsole wäre dann:
6 * 3 = 18
Wenn wir nun der zweiten Zahl den Datentyp double verpassen, ändert sich unser Code darauf:
int n1 = 6; double n2 = 3; System.out.println(String.format("%d * %f = %f", n1, n2, (n1*n2)));
Das Ergebnis ist jetzt etwas unschön:
6 * 3,000000 = 18,000000
Praktischerweise können wir die Anzahl der Kommastellen von Dezimalzahlen mit String.format festlegen.
Das sehen wir uns jetzt gleich als nächstes an.
2. Die Kommastellen in Dezimalzahlen bestimmen
Nehmen wir mal an, bei unserer double-Variable handelt es sich um einen Geldbetrag in Euro und Cents. Dann sind 2 Nachkommastellen üblich.
Die Anzahl der Nachkommastellen können wir in Java mit String.format festlegen, indem wir vor dem „f“ beim %f ein „.2“ einfügen, z.B. dann auf „%.2f“:
int n1 = 6; double n2 = 3; System.out.println(String.format("%d * %.2f = %.2f", n1, n2, (n1*n2)));
Das Ergebnis sieht doch schonmal viel besser aus:
6 * 3,00 = 18,00
Jetzt gibt es nur noch einen Schönheitsfehler, wenn wir eine zweite Rechnung darunter haben wollen, die z.b. größere Zahlen umfasst:
int n1 = 6; double n2 = 3; double n3 = 14; System.out.println(String.format("%d * %.2f = %.2f", n1, n2, (n1*n2))); System.out.println(String.format("%d * %.2f = %.2f", n1, n3, (n1*n3)));
Das Ergebnis ist ein wenig unschön verschoben, weil größere Zahlen natürlich mehr Platz brauchen:
6 * 3,00 = 18,00
6 * 14,00 = 84,00
Vielleicht kennst du Tabulatoren aus Programmen wie Microsoft Word? Mit diesen kann man z.B. rechtsbündige Tabulatoren auf bestimmte Abstände einstellen, und die Inhalte passen sich dann rechtsbündig an diese Tabulatoren an.
Genau solche Tabulatoren gibt es auch in Java mit Hilfe von String.format!
3. Tabulatoren in Java mit String.format einfügen
Mit der Methode String.format kannst du in Java sowohl rechtsbündige als auch linksbündige Tabulatoren nutzen.
Wir beginnen mit den rechtsbündigen Tabulatoren.
3.1 Rechtsbündige Tabulatoren bei der Konsolen-Ausgabe in Java
Wenn wir direkt hinter dem %-Zeichen bei einem unserer Platzhalter noch eine Zahl einfügen, führt das zu einem rechtsbündigen Tabulator, der uns den entsprechenden Abstand zum vorherigem Text ermöglicht.
Weil es leichter vorgeführt wie erklärt wird, hier das Code-Beispiel von vorhin, um zwei rechtsbündige Tabulatoren erweitert:
int n1 = 6; double n2 = 3; double n3 = 14; System.out.println(String.format("%d * %7.2f = %8.2f", n1, n2, (n1*n2))); System.out.println(String.format("%d * %7.2f = %8.2f", n1, n3, (n1*n3)));
Das Ergebnis ist nun schön auf einer Linie:
6 * 3,00 = 18,00
6 * 14,00 = 84,00
Wenn du die 7 bzw. die 8 nach dem % abänderst, ändern sich natürlich die Abstände der Tabulatoren entsprechend.
Eine letzte Sache noch: linksbündige Tabulatoren.
3.2 Linksbündige Tabulatoren in Java mit String.format
Linksbündige Tabulatoren funktionieren genau gleich wie rechtsbündige, nur kommt vor der Zahl nach dem %-Zeichen noch ein Minus-Zeichen, also z.B. so (statt 7 steht nun -7 bei der zweiten Zahl):
System.out.println(String.format("%d * %-7.2f = %8.2f", n1, n2, (n1*n2)));
4. Warum String.format noch Vorteile bringt
Dadurch dass die Formatierung unabhängig von den konkreten Werten ist, kann sie für mehrfache Ausgaben wiederverwendet werden.
Anstatt also zu schreiben:
System.out.println(String.format("%d * %7.2f = %8.2f", n1, n2, (n1*n2))); System.out.println(String.format("%d * %7.2f = %8.2f", n1, n3, (n1*n3))); System.out.println(String.format("%d * %7.2f = %8.2f", n1, n4, (n1*n4))); System.out.println(String.format("%d * %7.2f = %8.2f", n1, n5, (n1*n5)));
Wäre auch folgendes möglich:
String formatter = "%d * %7.2f = %8.2f"; System.out.println(String.format(formatter, n1, n2, (n1*n2))); System.out.println(String.format(formatter, n1, n3, (n1*n3))); System.out.println(String.format(formatter, n1, n4, (n1*n4))); System.out.println(String.format(formatter, n1, n5, (n1*n5)));
Erstens spart man so etwas Platz und Schreibarbeit, was immer nett ist.
Vor allem aber muss die Formatierung so an nur einer einzigen Stelle geändert werden statt an 4.
5. System.out.printf als Alternative für Schreibfaule
Wer es ein wenig übertrieben findet immer so viel schreiben zu müssen, kann sich die Arbeit auch abkürzen, und statt
System.out.println(String.format("%d * %7.2f = %8.2f", n1, n2, (n1*n2)));
auch einfach
System.out.printf("%d * %7.2f = %8.2f", n1, n2, (n1*n2));
schreiben.
Es gibt dabei nur einen Nachteil: Durch das Wegfallen des println müssen Zeilenumbrüche „händisch“ eingefügt werden. Das geht mit „\n“, also z.B. so:
System.out.println(String.format("%d * %7.2f \n = %8.2f", n1, n2, (n1*n2)));
Hier wird z.B. vor dem =-Zeichen ein Zeilenumbruch eingefügt.
6. Anwendungsbeispiel: Kassabon mit String.format in Java
Mit den obigen Tricks ist es relative einfach möglich, z.B. einen schönen Kassabon darzustellen:
Das wars erstmal mit den wichtigesten Infos zu String.format und printf in Java.
Versuch doch mal, ob auch du so einen Kassabon nachprogrammieren kannst!