Formatieren mit printf () in Java
1. Einführung
In this tutorial, we’ll demonstrate different examples of formatting with the printf()method.
Die Methode ist Teil der Klassejava.io.PrintStreamund bietet eine String-Formatierung ähnlich der Funktionprintf()in C.
2. Syntax
Wir können eine der folgendenPrintStream-Methoden verwenden, um die Ausgabe zu formatieren:
System.out.printf(format, arguments);
System.out.printf(locale, format, arguments);
Wir geben die Formatierungsregeln mit dem Parameterformatan. Regeln beginnen mit dem Zeichen‘%'.
Schauen wir uns ein kurzes Beispiel an, bevor wir uns mit den Details der verschiedenen Formatierungsregeln befassen:
System.out.printf("Hello %s!%n", "World");
Dies erzeugt die folgende Ausgabe:
Hello World!
Wie oben gezeigt, enthält die Formatzeichenfolge einfachen Text und zwei Formatierungsregeln. Die erste Regel wird zum Formatieren des Zeichenfolgenarguments verwendet. Die zweite Regel fügt am Ende der Zeichenfolge ein Zeilenumbruchzeichen hinzu.
2.1. Formatregeln
Schauen wir uns die Formatzeichenfolge genauer an. Es besteht aus Literalen und Formatangaben. Format specifiers include flags, width, precision, and conversion characters in der folgenden Reihenfolge:
%[flags][width][.precision]conversion-character
Die Angaben in den Klammern sind optional.
Intern verwendetprintf() die Klassejava.util.Formatter, um die Formatzeichenfolge zu analysieren und die Ausgabe zu generieren. Zusätzliche Optionen für Formatzeichenfolgen finden Sie inFormatter Javadoc.
2.2. Konvertierungszeichen
The conversion-character is required and determines how the argument is formatted. Konvertierungszeichen sind nur für bestimmte Datentypen gültig. Einige häufige sind:
-
s – formatiert Zeichenfolgen
-
d - formatiert Dezimalzahlen
-
f - formatiert die Gleitkommazahlen
-
t– formatiert Datums- / Zeitwerte
Wir werden diese und einige andere später in diesem Artikel untersuchen.
2.3. Optionale Modifikatoren
The [flags] define standard ways to modify the output und werden am häufigsten zum Formatieren von Ganzzahlen und Gleitkommazahlen verwendet.
The [width] specifies the field width for outputting the argument. Dies ist die Mindestanzahl von Zeichen, die in die Ausgabe geschrieben werden.
The [.precision] specifies the number of digits of precision bei der Ausgabe von Gleitkommawerten. Zusätzlich können wir damit die Länge eines Teilstrings definieren, der ausString extrahiert werden soll.
3. Leitungstrennzeichen
To break the string into separate lines, we have a %n specifier:
System.out.printf("example%nline%nterminator");
Das obige Code-Snippet erzeugt die folgende Ausgabe:
example
line
terminator
The %n separator printf() will automatically insert the host system’s native line separator.
4. Boolesche Formatierung
To format boolean values, we use the %b format. Dies funktioniert folgendermaßen: Wenn der Eingabewerttrue beträgt, beträgt der Ausgabewerttrue. Andernfalls beträgt die Ausgabefalse.
Also, wenn wir das tun:
System.out.printf("%b%n", null);
System.out.printf("%B%n", false);
System.out.printf("%B%n", 5.3);
System.out.printf("%b%n", "random text");
Dann werden wir sehen:
false
FALSE
TRUE
true
Beachten Sie, dass wir%B für die Formatierung in Großbuchstaben verwenden können.
5. String-Formatierung
To format a simple string, we’ll use the %s combination. Zusätzlich können wir den String in Großbuchstaben schreiben:
printf("'%s' %n", "example");
printf("'%S' %n", "example");
Und die Ausgabe ist:
'example'
'example'
Um eine Mindestlänge anzugeben, können wir auchwidth angeben:
printf("'%15s' %n", "example");
Welches gibt uns:
' example'
Wenn wir unsere Zeichenfolge linksbündig ausrichten müssen, können wir die-‘ flag verwenden:
printf("'%-10s' %n", "example");
Und die Ausgabe ist:
'example '
Darüber hinaus können wir die Anzahl der Zeichen in unserer Ausgabe begrenzen, indem wirprecision angeben:
System.out.printf("%2.2s", "Hi there!");
Die erste‘x'-Zahl in%x.ys-Syntax ist das Auffüllen. ‘y' ist die Anzahl der Zeichen.
In unserem Beispiel hier ist die AusgabeHi.
6. Zeichenformatierung
Das Ergebnis von%c ist ein Unicode-Zeichen:
System.out.printf("%c%n", 's');
System.out.printf("%C%n", 's');
Der GroßbuchstabeC setzt das Ergebnis in Großbuchstaben:
s
S
Wenn wir ihm jedoch ein ungültiges Argument geben, wirftFormatterIllegalFormatConversionException.
7. Zahlenformatierung
7.1. Ganzzahlige Formatierung
Die Methodeprintf()akzeptiert alle in der Sprache verfügbaren Ganzzahlen. byte, short, int, long undBigInteger , wenn wir%d verwenden:
System.out.printf("simple integer: %d%n", 10000L);
Mit Hilfe des Zeichens‘d'haben wir:
simple integer: 10000
Falls wirto format our number with the thousands separator, we can use the ‘,' flag. benötigen Und wir können unsere Ergebnisse auch für verschiedene Gebietsschemas formatieren:
System.out.printf(Locale.US, "%,d %n", 10000);
System.out.printf(Locale.ITALY, "%,d %n", 10000);
Wie wir sehen, ist die Formatierung in den USA anders als in Italien:
10,000
10.000
7.2. Float- und Doppelformatierung
Zum Formatieren einer Gleitkommazahl benötigen wir das Format "f":
System.out.printf("%f%n", 5.1473);
Welches wird ausgegeben:
5.147300
Das erste, was mir in den Sinn kommt, ist natürlich, dieprecision zu steuern:
System.out.printf("'%5.2f'%n", 5.1473);
Hier definieren wirwidth unserer Zahl als5, und die Länge des Dezimalteils beträgt2:
' 5.15'
Hier haben wir einen Abstand vom Anfang der Zahl, um die vordefinierte Breite zu unterstützen.
Um unsere Ausgabein scientific notation, we just use the ‘e' conversion character zu haben:
System.out.printf("'%5.2e'%n", 5.1473);
Und das Ergebnis ist das Folgende:
'5.15e+00'
8. Datums- und Uhrzeitformatierung
Für die Formatierung von Datum und Uhrzeitthe conversion string is a sequence of two characters: the ‘t' or ‘T' character and the conversion suffix. Lassen Sie uns anhand der Beispiele die gängigsten Suffixzeichen für die Formatierung von Uhrzeit und Datum untersuchen.
Für eine erweiterte Formatierung können wir definitivDateTimeFormatter verwenden, das seit Java 8 verfügbar ist.
8.1. Zeitformatierung
Sehen wir uns zunächst die Liste einiger nützlicher Suffixzeichen für die Zeitformatierung an:
-
‘H', ‘M', ‘S' – characters are responsible for extracting the hours, minutes and second vom EingangDate
-
‘L', ‘N' - um die Zeit in Millisekunden und Nanosekunden entsprechend darzustellen
-
‘p' - Fügt die Formatierung am / pm hinzu
-
‘z' - druckt den Zeitzonenversatz aus
Angenommen, wir wollten den Zeitteil vonDate ausdrucken:
Date date = new Date();
System.out.printf("%tT%n", date);
Der obige Code zusammen mit der Kombination von‘%tT'ergibt die folgende Ausgabe:
13:51:15
Falls wir eine detailliertere Formatierung benötigen, können wir verschiedene Zeitabschnitte aufrufen:
System.out.printf("hours %tH: minutes %tM: seconds %tS%n", date, date, date);
Wenn wir‘H',‘M' und‘S' verwendet haben, erhalten wir:
hours 13: minutes 51: seconds 15
Das mehrfache Auflisten vondate ist jedoch ein Schmerz. Alternativ könnento get rid of multiple arguments, we can use the index reference of our input parameter which is 1$ in our case:
System.out.printf("%1$tH:%1$tM:%1$tS %1$tp %1$tL %1$tN %1$tz %n", date);
Hier wollen wir als Ausgabe die aktuelle Zeit, am / pm, die Zeit in Millisekunden, Nanosekunden und den Zeitzonenoffset:
13:51:15 pm 061 061000000 +0400
8.2. Datumsformatierung
Wie bei der Zeitformatierung haben wir spezielle Formatierungszeichen für die Datumsformatierung:
-
‘A' - druckt den ganzen Wochentag aus
-
‘d' - formatiert einen zweistelligen Tag des Monats
-
‘B' - steht für den vollständigen Monatsnamen
-
‘m' - formatiert einen zweistelligen Monat
-
‘Y' - gibt ein Jahr in vier Ziffern aus
-
‘y' - gibt die letzten beiden Ziffern des Jahres aus
Wenn wir also den Wochentag gefolgt vom Monat anzeigen möchten:
System.out.printf("%1$tA, %1$tB %1$tY %n", date);
Wenn wir dann‘A',‘B' und‘Y' verwenden, erhalten wir:
Thursday, November 2018
Damit unsere Ergebnisse alle im numerischen Format vorliegen, können wir die Buchstaben "A', ‘B', ‘Y" durch "d', ‘m', ‘y'" ersetzen:
System.out.printf("%1$td.%1$tm.%1$ty %n", date);
Was dazu führen wird:
22.11.18
9. Zusammenfassung
In diesem Artikel haben wir diskutiert, wie diePrintStream#printf Methode verwendet wird, um die Ausgabe zu formatieren. Wir haben uns die verschiedenen Formatmuster angesehen, mit denen die Ausgabe für allgemeine Datentypen gesteuert wird.
Schließlich kann wie immer der während der Diskussion verwendete Codeover on GitHub gefunden werden.