Formatierung mit printf () in Java

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:

  • – 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.