Formatering med printf () i Java

1. Introduksjon

I denne opplæringen vil vi demonstrere forskjellige eksempler på formatering med printf ()metode.

Metoden er en del av java.io.PrintStream klasse og gir strengformatering som ligner på printf () funksjon i C.

2. Syntaks

Vi kan bruke ett av følgende PrintStream metoder for å formatere utdataene:

System.out.printf (format, argumenter); System.out.printf (sted, format, argumenter);

Vi spesifiserer formateringsreglene ved hjelp av format parameter. Regler starter med ‘%' karakter.

La oss se på et raskt eksempel før vi dykker ned i detaljene i de forskjellige formateringsreglene:

System.out.printf ("Hei% s!% N", "Verden");

Dette gir følgende utdata:

Hei Verden!

Som vist ovenfor inneholder formatstrengen ren tekst og to formateringsregler. Den første regelen brukes til å formatere strengargumentet. Den andre regelen legger til et nytt linjetegn på slutten av strengen.

2.1. Formater regler

La oss se nærmere på formatstrengen. Den består av bokstaver og formatspesifikatorer. Formatspesifikatorer inkluderer flagg, bredde, presisjon og konverteringstegn i følgende rekkefølge:

% [flagg] [bredde] [. presisjon] konverteringstegn

Spesifikatorer i parentesene er valgfrie.

Internt, printf () bruker klassen java.util.Formatter til å analysere formatstrengen og generere utdataene. Ytterligere formatstrengalternativer finner du i Formatter Javadoc.

2.2. Konverteringstegn

De konvertering-karakter kreves og bestemmer hvordan argumentet er formatert. Konverteringstegn er bare gyldige for visse datatyper. Noen vanlige er:

  • s - formaterer strenger
  • d - formater desimaltall
  • f - formaterer flytende tall
  • t- formaterer dato / klokkeslettverdier

Vi vil utforske disse og noen få andre senere i artikkelen.

2.3. Valgfrie modifikatorer

De [flagg] definere standard måter å endre utdataene på og er mest vanlig for formatering av heltall og flytende tall.

Bredden] spesifiserer feltbredden for å sende argumentet. Det representerer minimum antall tegn skrevet til utdataene.

[.Precision] angir antall sifre med presisjon når du angir flytende punktverdier. I tillegg kan vi bruke den til å definere lengden på et underlag som skal ekstraheres fra en String.

3. Linjeseparator

For å bryte strengen i separate linjer har vi en%n spesifikator:

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

Kodebiten ovenfor gir følgende utdata:

baeldung linjeterminator

De % n separator printf () vil automatisk sette inn vertssystemets opprinnelige linjeseparator.

4. Boolsk formatering

For å formatere boolske verdier bruker vi % b format. Det fungerer på følgende måte: Hvis inngangsverdien er ekte, er utgangen ekte. Ellers er utdataene falsk.

Så hvis vi gjø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", "tilfeldig tekst");

Så får vi se:

false FALSE TRUE true 

Legg merke til at vi kan bruke % B for storformatering.

5. Strengformatering

For å formatere en enkel streng bruker vi % s kombinasjon. I tillegg kan vi gjøre strengen stor:

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

Og produksjonen er:

'baeldung' 'BAELDUNG'

For å spesifisere en minimumslengde kan vi også spesifisere en bredde:

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

Som gir oss:

'baeldung'

Hvis vi trenger å venstrejustere strengen vår, kan vi bruke ‘-' flagg:

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

Og produksjonen er:

'baeldung'

Enda mer kan vi begrense antall tegn i utdataene våre ved å spesifisere a presisjon:

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

Den første ‘X’ nummer i % x.ys syntaksen er polstringen. ‘Y’ er antall tegn.

For vårt eksempel her er utgangen Hei.

6. Char-formatering

Resultatet av % c er et Unicode-tegn:

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

Hovedstaden C vil ha store bokstaver i resultatet:

s S

Men hvis vi gir det et ugyldig argument, da Formaterer vil kaste IllegalFormatConversionException.

7. Tallformatering

7.1. Heltallformatering

De printf () metoden godtar alle heltallene som er tilgjengelige på språket; byte, kort, int, lang og BigInteger hvis vi bruker % d:

System.out.printf ("enkelt heltall:% d% n", 10000L);

Ved hjelp av ‘D’ karakter, vi får:

enkelt heltall: 10000

I tilfelle vi trenger det for å formatere nummeret vårt med tusenvis skilletegn, kan vi bruke ‘,'flagg. Og vi kan også formatere resultatene for forskjellige lokaliteter:

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

Som vi ser, er formateringen i USA annerledes enn i Italia:

10,000 10.000

7.2. Flyt og dobbel formatering

For å formatere et flytenummer trenger vi ‘f’ formatet:

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

Som vil sende ut:

5.147300

Selvfølgelig er det første som kommer opp i tankene å kontrollere presisjon:

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

Her definerer vi bredde av vårt nummer som 5, og lengden på desimaldelen er 2:

' 5.15'

Her har vi ett mellomrom fra begynnelsen av nummeret for å støtte den forhåndsdefinerte bredden.

Å ha vår produksjon i vitenskapelig notasjon bruker vi bare ‘E’ konverteringskarakter:

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

Og resultatet er følgende:

'5.15e + 00'

8. Formatering av dato og klokkeslett

For formatering av dato og klokkeslett, konverteringsstrengen er en sekvens med to tegn: ‘T’ eller ‘T’ karakter og konverteringssuffikset. La oss utforske de vanligste tids- og datoformateringssuffikstegnene med eksemplene.

Definitivt, for mer avansert formatering kan vi bruke DateTimeFormatter som har vært tilgjengelig siden Java 8.

8.1. Tidsformatering

La oss først se listen over nyttige suffikstegn for tidsformatering:

  • 'H', 'M', 'S' - tegn er ansvarlige for å trekke ut timer, minutter og sekund fra inngangen Dato
  • 'L', 'N' - å representere tiden i millisekunder og nanosekunder tilsvarende
  • ‘P’ - legger til am / pm-formatering
  • ‘Z’ - skriver ut tidssoneforskyvningen

La oss si at vi ønsket å skrive ut tidsdelen av a Dato:

Dato dato = ny dato (); System.out.printf ("% tT% n", dato);

Koden ovenfor sammen med ‘% TT’ kombinasjon gir følgende utgang:

13:51:15

I tilfelle vi trenger mer detaljert formatering, kan vi ringe etter forskjellige tidssegmenter:

System.out.printf ("timer% tH: minutter% tM: sekunder% tS% n", dato, dato, dato);

Etter å ha brukt ‘H’, ‘M’, og ‘S’ vi får:

timer 13: minutter 51: sekunder 15

Skjønt, notering Dato flere ganger er det vondt. Alternativt for å bli kvitt flere argumenter, kan vi bruke indeksreferansen til inngangsparameteren vår som er 1$ i vårt tilfelle:

System.out.printf ("% 1 $ tH:% 1 $ tM:% 1 $ tS% 1 $ tp% 1 $ tL% 1 $ tN% 1 $ tz% n", dato);

Her ønsker vi som utgang gjeldende tid, am / pm, tid i millisekunder, nanosekunder og tidssoneforskyvning:

13:51:15 pm 061 061000000 +0400

8.2. Datoformatering

I likhet med tidsformatering har vi spesielle formateringstegn for datoformatering:

  • 'EN' - skriver ut hele ukedagen
  • ‘D’ - formater en tosifret dag i måneden
  • ‘B’ - er for hele månedens navn
  • ‘M’ - formater en tosifret måned
  • ‘Y’ - gir ut hvert år i fire sifre
  • ‘Y’ - skriver ut de to siste sifrene i året

Så hvis vi ønsket å vise ukedagen, etterfulgt av måneden:

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

Bruk deretter 'EN', ‘B’, og ‘Y’, vi får:

Torsdag november 2018

For å ha resultatene i numerisk format, kan vi erstatteA ',' B ',' Y ‘Bokstaver med‘d ',' m ',' y ':

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

Som vil resultere i:

22.11.18

9. Oppsummering

I denne artikkelen diskuterte vi hvordan du bruker PrintStream # printf metode for å formatere utdata. Vi så på de forskjellige formatmønstrene som ble brukt til å kontrollere utdataene for vanlige datatyper.

Til slutt, som alltid, finner du koden som ble brukt under diskusjonen på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found