Formatierung mit printf () in Java

1. Einleitung

In diesem Tutorial werden verschiedene Beispiele für die Formatierung mit der printf () -Methode gezeigt .

Die Methode ist Teil der Klasse java.io.PrintStream und bietet eine String-Formatierung ähnlich der Funktion printf () in C.

2. Syntax

Wir können eine der folgenden PrintStream- Methoden verwenden, um die Ausgabe zu formatieren:

System.out.printf(format, arguments); System.out.printf(locale, format, arguments);

Wir legen die Formatierungsregeln mit dem Formatparameter fest . 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 Formatbezeichnern. Formatspezifizierer umfassen Flags, Breite, Genauigkeit und Konvertierungszeichen in der folgenden Reihenfolge:

%[flags][width][.precision]conversion-character

Die Angaben in den Klammern sind optional.

Intern verwendet printf () die Klasse java.util.Formatter, um die Formatzeichenfolge zu analysieren und die Ausgabe zu generieren. Weitere Optionen für Formatzeichenfolgen finden Sie im Formatter Javadoc.

2.2. Konvertierungszeichen

Das Konvertierungszeichen ist erforderlich und bestimmt, wie das Argument formatiert wird . Konvertierungszeichen sind nur für bestimmte Datentypen gültig. Einige gebräuchliche sind:

  • s - formatiert Strings
  • 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

Die [Flags] definieren Standardmethoden zum Ändern der Ausgabe und werden am häufigsten zum Formatieren von Ganzzahlen und Gleitkommazahlen verwendet.

Die [Breite] gibt die Feldbreite für die Ausgabe des Arguments an. Es stellt die minimale Anzahl von Zeichen dar, die in die Ausgabe geschrieben werden.

Die [.Präzision] gibt die Anzahl der Genauigkeitsstellen bei der Ausgabe von Gleitkommawerten an. Darüber hinaus können wir damit die Länge eines Teilstrings definieren, der aus einem String extrahiert werden soll.

3. Leitungstrenner

Um die Zeichenfolge in separate Zeilen zu unterteilen, haben wir einen% n- Bezeichner :

System.out.printf("baeldung%nline%nterminator");

Das obige Code-Snippet erzeugt die folgende Ausgabe:

baeldung line terminator

Das % n- Trennzeichen printf () fügt automatisch das native Zeilentrennzeichen des Hostsystems ein .

4. Boolesche Formatierung

To format boolean values, we use the %b format. It works the following way: If the input value is true, the output is true. Otherwise, the output is false.

So, if we do:

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");

Then we'll see:

false FALSE TRUE true 

Notice that we can use %B for uppercase formatting.

5. String Formatting

To format a simple string, we'll use the %s combination. Additionally, we can make the string uppercase:

printf("'%s' %n", "baeldung"); printf("'%S' %n", "baeldung");

And the output is:

'baeldung' 'BAELDUNG'

Also, to specify a minimum length, we can specify a width:

printf("'%15s' %n", "baeldung");

Which gives us:

' baeldung'

If we need to left-justify our string, then we can use the ‘-‘ flag:

printf("'%-10s' %n", "baeldung");

And the output is:

'baeldung '

Even more, we can limit the number of characters in our output by specifying a precision:

System.out.printf("%2.2s", "Hi there!");

The first ‘x' number in %x.ys syntax is the padding. ‘y' is the number of chars.

For our example here, the output is Hi.

6. Char Formatting

The result of %c is a Unicode character:

System.out.printf("%c%n", 's'); System.out.printf("%C%n", 's');

The capital letter C will uppercase the result:

s S

But, if we give it an invalid argument, then Formatter will throw IllegalFormatConversionException.

7. Number Formatting

7.1. Integer Formatting

The printf() method accepts all the integers available in the language; byte, short, int, long and BigInteger if we use %d:

System.out.printf("simple integer: %d%n", 10000L);

With the help of the ‘d' character, we'll have:

simple integer: 10000

In case we need to format our number with the thousands separator, we can use the ‘,'flag. And we can also format our results for different locales:

System.out.printf(Locale.US, "%,d %n", 10000); System.out.printf(Locale.ITALY, "%,d %n", 10000);

As we see, the formatting in the US is different than in Italy:

10,000 10.000

7.2. Float and Double Formatting

To format a float number, we'll need the ‘f' format:

System.out.printf("%f%n", 5.1473);

Which will output:

5.147300

Of course, the first thing that comes to mind is to control the precision:

System.out.printf("'%5.2f'%n", 5.1473);

Here we define the width of our number as 5, and the length of the decimal part is 2:

' 5.15'

Here we have one space padding from the beginning of the number to support the predefined width.

To have our output in scientific notation, we just use the ‘e' conversion character:

System.out.printf("'%5.2e'%n", 5.1473);

And the result is the following:

'5.15e+00'

8. Date and Time Formatting

For date and time formatting, the conversion string is a sequence of two characters: the ‘t' or ‘T' character and the conversion suffix. Let's explore the most common time and date formatting suffix characters with the examples.

Definitely, for more advanced formatting we can use DateTimeFormatter which has been available since Java 8.

8.1. Time Formatting

First, let's see the list of some useful suffix characters for Time Formatting:

  • ‘H', ‘M', ‘S' – characters are responsible for extracting the hours, minutes and second from the input Date
  • ‘L', ‘N' – to represent the time in milliseconds and nanoseconds accordingly
  • ‘p' – adds am/pm formatting
  • ‘z' – prints out the timezone offset

Now, let's say we wanted to print out the time part of a Date:

Date date = new Date(); System.out.printf("%tT%n", date);

The code above along with ‘%tT' combination produces the following output:

13:51:15

In case we need more detailed formatting, we can call for different time segments:

System.out.printf("hours %tH: minutes %tM: seconds %tS%n", date, date, date);

Having used ‘H', ‘M', and ‘S' we get:

hours 13: minutes 51: seconds 15

Though, listing date multiple times is a pain. Alternatively, to 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);

Here we want as an output the current time, am/pm, time in milliseconds, nanoseconds and the timezone offset:

13:51:15 pm 061 061000000 +0400

8.2. Date Formatting

Like time formatting, we have special formatting characters for date formatting:

  • ‘A' – prints out the full day of the week
  • ‘d' – formats a two-digit day of the month
  • ‘B' – is for the full month name
  • ‘m' – formats a two-digit month
  • ‘Y' – outputs a year in four digits
  • ‘y' – outputs the last two digits of the year

So, if we wanted to show the day of the week, followed by the month:

System.out.printf("%1$tA, %1$tB %1$tY %n", date);

Then using ‘A', ‘B', and ‘Y', we'd get:

Thursday, November 2018

To have our results all in numeric format, we can replace the ‘A', ‘B', ‘Y ‘ letters with ‘d', ‘m', ‘y':

System.out.printf("%1$td.%1$tm.%1$ty %n", date);

Which will result in:

22.11.18

9. Summary

In diesem Artikel haben wir erläutert, wie die PrintStream # printf- Methode zum Formatieren der Ausgabe verwendet wird. Wir haben uns die verschiedenen Formatmuster angesehen, mit denen die Ausgabe für gängige Datentypen gesteuert wird.

Schließlich ist der während der Diskussion verwendete Code wie immer auf GitHub zu finden.