Formatering med printf () i Java

1. Introduktion

I denna handledning kommer vi att visa olika exempel på formatering med metoden printf () .

Metoden är en del av klassen java.io.PrintStream och ger formatering av sträng som liknar funktionen printf () i C.

2. Syntax

Vi kan använda en av följande PrintStream- metoder för att formatera utdata:

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

Vi anger formateringsreglerna med hjälp av format parameter. Regler börjar med tecknet '%' .

Låt oss titta på ett snabbt exempel innan vi dyker in i detaljerna i de olika formateringsreglerna:

System.out.printf("Hello %s!%n", "World");

Detta ger följande utdata:

Hello World!

Som visas ovan innehåller formatsträngen vanlig text och två formateringsregler. Den första regeln används för att formatera strängargumentet. Den andra regeln lägger till en ny linjetecken i slutet av strängen.

2.1. Formatregler

Låt oss ta en titt på formatsträngen närmare. Den består av bokstäver och formatspecifikationer. Formatspecifikatorer inkluderar flaggor, bredd, precision och konverteringstecken i följande ordning:

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

Specifikatorer i parenteserna är valfria.

Internt använder printf () klassen java.util.Formatter för att analysera formatsträngen och generera utdata. Ytterligare formatsträngalternativ finns i Formatter Javadoc.

2.2. Konverteringstecken

Den omvandlingen tecken krävs och bestämmer hur argumentet formateras . Konverteringstecken är endast giltiga för vissa datatyper. Några vanliga är:

  • s - formaterar strängar
  • d - formaterar decimala heltal
  • f - formaterar flytpunktsnumren
  • t - formaterar datum / tidvärden

Vi kommer att utforska dessa och några andra senare i artikeln.

2.3. Valfria modifierare

De [flaggor] definiera standard sätt att ändra produktionen och är vanligast för formatering heltal och flyttal.

[Bredd] anger fältbredden för att mata ut argumentet. Det representerar det minsta antalet tecken som skrivs till utdata.

[.Precision] anger antalet precisionssiffror vid matning av flytpunktsvärden. Dessutom kan vi använda den för att definiera längden på ett substrat som ska extraheras från en sträng .

3. Linjeseparator

För att bryta strängen i separata rader har vi en% n- specifikator :

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

Kodavsnittet ovan kommer att producera följande utdata:

baeldung line terminator

Det % n separator printf () kommer automatiskt att infoga värdsystemets nativ linje separator .

4. Boolsk formatering

För att formatera booleska värden använder vi formatet % b . Det fungerar på följande sätt: Om ingångsvärdet är sant är utmatningen sant . Annars är produktionen falsk .

Så om vi gör det:

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

Då får vi se:

false FALSE TRUE true 

Observera att vi kan använda % B för versaler med stora bokstäver.

5. Strängformatering

För att formatera en enkel sträng använder vi % s- kombinationen . Dessutom kan vi göra strängen stor:

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

Och resultatet är:

'baeldung' 'BAELDUNG'

För att ange en minimilängd kan vi också ange en bredd :

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

Vilket ger oss:

' baeldung'

Om vi ​​behöver vänsterjustera vår sträng kan vi använda flaggan ' -' :

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

Och resultatet är:

'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

I den här artikeln diskuterade vi hur man använder PrintStream # printf- metoden för att formatera utdata. Vi tittade på de olika formatmönstren som används för att styra utdata för vanliga datatyper.

Slutligen, som alltid, kan koden som används under diskussionen hittas på GitHub.