Vejledning til java.util.Formatter

1. Oversigt

I denne artikel vil vi diskutere Snor formatering i Java ved hjælp af java.util.Formater klasse, som understøtter layoutjustering og justering.

2. Sådan bruges Formater

Husk C'er printf? Formatering af en Snor i Java føles meget ens.

Det format() metode til Formater eksponeres via en statisk metode fra Snor klasse. Denne metode accepterer en skabelon Snor og en liste over argumenter, der skal udfyldes skabelonen med:

Stringhilsner = String.format ("Hej folk, velkommen til% s!", "Baeldung");

Den resulterende Snor er:

"Hej folk, velkommen til Baeldung!"

En skabelon er en Snor der indeholder en del statisk tekst og et eller flere formatspecifikatorer, der angiver hvilket argument der skal placeres på den bestemte position.

I dette tilfælde, der er et specifikt format % s, som bliver erstattet af det tilsvarende argument.

3. Formater specifikationer

3.1. Generel syntaks

Syntaksen for formatspecifikatorer for Generelt, Karakter, og Numerisk typen er:

% [argument_index $] [flag] [bredde] [. præcision] konvertering

Specifikatorer argument_index, flag, breddeog præcision er valgfri.

  • argument_index del er et heltal jeg - angiver, at med argument fra argumentlisten skal bruges her
  • flag er et sæt tegn, der bruges til at ændre outputformatet
  • bredde er et positivt heltal, der angiver det mindste antal tegn, der skal skrives til output
  • præcision er et heltal, der normalt bruges til at begrænse antallet af tegn, hvis specifikke opførsel afhænger af konverteringen
  • er den obligatoriske del. Det er et tegn, der angiver, hvordan argumentet skal formateres. Sættet med gyldige konverteringer for et givet argument afhænger af argumentets datatype

I vores eksempel ovenfor, hvis vi udtrykkeligt ønsker at angive nummeret på et argument, kan vi skrive det ved hjælp af 1$ og 2$ argumentindekser.

Begge disse er henholdsvis det første og det andet argument:

Stringhilsner = String.format ("Hej% 2 $ s, velkommen til% 1 $ s!", "Baeldung", "Folk");

3.2. Til Dato tid Repræsentation

% [argument_index $] [flag] [bredde] konvertering

Igen argument_index, flagog bredde er valgfri.

Lad os tage et eksempel for at forstå dette:

@Test offentlig ugyldig nårFormatSpecifierForCalendar_thenGotExpected () {Kalender c = ny GregorianCalendar (2017, 11, 10); Streng s = String.format ("Datoen er:% tm% 1 $ te,% 1 $ tY", c); assertEquals ("Datoen er: 12 10,2017", s); }

Her, for hver formatspecifikator, vil det første argument blive brugt, derfor 1$. Her, hvis vi springer over argument_index til specificering af 2. og 3. format forsøger den at finde 3 argumenter, men vi skal bruge det samme argument for alle 3 formatspecifikatorer.

Så det er ok, hvis vi ikke specificerer argument _index for den første, men vi skal specificere den for de to andre.

Det flag her består af to tegn. Hvor den første karakter altid er en 'T' eller 'T'. Den anden karakter afhænger af hvilken del af Kalender skal vises.

I vores eksempel angiver det første format tm, angiver måned formateret som to cifre, te angiver månedsdagen og tY angivet År formateret som fire cifre.

3.3. Formater specifikationer uden argumenter

% [flag] [bredde] konvertering

Det valgfri flag og bredde er de samme som defineret i ovenstående afsnit.

Det krævede konvertering er en karakter eller Snor angiver indhold, der skal indsættes i output. I øjeblikket er det kun den ‘%' og newline 'N' kan udskrives ved hjælp af dette:

@Test offentlig ugyldig nårNoArguments_thenExpected () {String s = String.format ("John scorede 90 %% i efterårssemesteret"); assertEquals ("John scorede 90% i efterårssemesteret", s); } 

Inde format(), hvis vi vil udskrive ‘%' - vi er nødt til at undslippe det ved at bruge ‘%%'.

4. Konverteringer

Lad os nu grave ind i alle detaljer i Format Specifier-syntaksen, begyndende med a konvertering. Bemærk, at du kan finde alle detaljerne i Formater javadocs.

Som vi bemærkede i ovenstående eksempler, konvertering del er påkrævet i alle formatspecifikationer, og den kan opdeles i flere kategorier.

Lad os se på hver enkelt ved at tage eksempler.

4.1. Generel

Bruges til enhver argumenttype. De generelle konverteringer er:

  1. 'B' eller 'B' - til Boolsk værdier
  2. 'H' eller 'H' - til HashCode
  3. 'S' eller 'S' - til Snor, hvis nul, det udskriver "null", ellers arg.toString ()

Vi prøver nu at vise boolsk og Snor værdier ved hjælp af de tilsvarende konverteringer:

@Test offentlig ugyldighed givenString_whenGeneralConversion_thenConvertedString () {String s = String.format ("Det rigtige svar er% s", falsk); assertEquals ("Det rigtige svar er falsk", s); s = String.format ("Det rigtige svar er% b", null); assertEquals ("Det rigtige svar er falsk", s); s = String.format ("Det rigtige svar er% B", sandt); assertEquals ("Det rigtige svar er SAND", s); }

4.2. Karakter

Bruges til de grundlæggende typer, der repræsenterer Unicode-tegn: char, karakter, byte, byte, kort, og Kort. Denne konvertering kan også bruges til typerne int og Heltal når Karakter.isValidCodePoint (int) vender tilbage rigtigt for dem.

Det kan skrives som 'C' eller 'C' baseret på den sag, vi ønsker.

Lad os prøve at udskrive nogle tegn:

@Test offentlig ugyldighed givenString_whenCharConversion_thenConvertedString () {String s = String.format ("Det rigtige svar er% c", 'a'); assertEquals ("Det rigtige svar er a", s); s = String.format ("Det rigtige svar er% c", null); assertEquals ("Det rigtige svar er null", s); s = String.format ("Det rigtige svar er% C", 'b'); assertEquals ("Det rigtige svar er B", s); s = String.format ("Det gyldige unicode-tegn:% c", 0x0400); assertTrue (Character.isValidCodePoint (0x0400)); assertEquals ("Det gyldige unicode-tegn: Ѐ", s); }

Lad os tage endnu et eksempel på et ugyldigt kodepunkt:

@Test (forventet = IllegalFormatCodePointException.class) offentlig ugyldig nårIllegalCodePointForConversion_thenError () {String s = String.format ("Det gyldige unicode-tegn:% c", 0x11FFFF); assertFalse (Character.isValidCodePoint (0x11FFFF)); assertEquals ("Det gyldige unicode-tegn: Ā", s); }

4.3. Numerisk - Integreret

Disse bruges til Java-integrerede typer: byte, byte, kort, kort, int og Heltal, langt, langt, og BigInteger. Der er tre konverteringer i denne kategori:

  1. 'D' - for decimaltal
  2. 'O' - for oktalt tal
  3. 'X' eller 'x' - for hexadecimalt tal

Lad os prøve at udskrive hver af disse:

@Test offentlig ugyldig nårNumericIntegralConversion_thenConvertedString () {String s = String.format ("Tallet 25 i decimal =% d", 25); assertEquals ("Tallet 25 i decimal = 25", s); s = String.format ("Tallet 25 i oktalt =% o", 25); assertEquals ("Antallet 25 i oktal = 31", s); s = String.format ("Tallet 25 i hexadecimal =% x", 25); assertEquals ("Tallet 25 i hexadecimal = 19", s); }

4.4. Numerisk - flydende punkt

Bruges til Java-typer med flydende punkt: flyde, flyde, dobbelt, dobbelt, og BigDecimal

  1. 'E' eller 'E'formateret som et decimaltal i edb-videnskabelig notation
  2. 'F'formateret som et decimaltal
  3. 'G' eller 'G'baseret på præcisionsværdien efter afrunding formateres denne konvertering til edb-videnskabelig notation eller decimalformat

Lad os prøve at udskrive flydende numre:

@Test offentlig ugyldig nårNumericFloatingConversion_thenConvertedString () {String s = String.format ("Det computeriserede videnskabelige format på 10000,00" + "=% e", 10000,00); assertEquals ("Det edb-videnskabelige format på 10000,00 = 1,000000e + 04", s); Streng s2 = String.format ("Decimalformatet 10.019 =% f", 10.019); assertEquals ("Decimalformatet 10.019 = 10.019000", s2); }

4.5. Andre konverteringer

  • Dato tid - for Java-typer, der er i stand til at kode en dato eller et klokkeslæt: lang, lang, kalender, Dato og TemporalAccessor. Til dette er vi nødt til at bruge præfikset 'T' eller 'T', som vi så tidligere
  • Procent - udskriver en bogstavelig ‘% '(‘ \ U0025')
  • Linjeseparator - udskriver en platformsspecifik linjeseparator

Lad os se på et simpelt eksempel:

@Test offentlig ugyldig nårLineSeparatorConversion_thenConvertedString () {String s = String.format ("First Line% nSecond Line"); assertEquals ("Første linje \ n" + "Anden linje", s); }

5. Flag

Flag bruges generelt til at formatere output. Mens der i tilfælde af dato og klokkeslæt bruges de til at angive, hvilken del af datoen der skal vises, som vi så i eksempel 4-eksemplet.

Et antal flag er tilgængelige, hvoraf en liste kan findes i dokumentationen.

Lad os se et eksempel på et flag for at forstå dets anvendelse. ‘-‘ bruges til at formatere output som venstrejusteret:

@Test offentligt ugyldigt nårSpecifyFlag_thenGotFormattedString () {String s = String.format ("Uden venstrejusteret flag:% 5d", 25); assertEquals ("Uden venstrejusteret flag: 25", s); s = String.format ("Med venstrejusteret flag:% -5d", 25); assertEquals ("Med venstre retfærdiggjort flag: 25", s); }

6. Præcision

For generelle konverteringer præcision er bare det maksimale antal tegn, der skal skrives til output. Mens f eller flydende konverteringer er præcisionen antallet af cifre efter radixpunktet.

Den første sætning er et eksempel på præcision med flydende tal, og den anden med generelle konverteringer:

@Test offentlig ugyldigt nårSpecifyPrecision_thenGotExpected () {String s = String.format ("Output of 25.09878 with Precision 2:% .2f", 25.09878); assertEquals ("Output af 25.09878 med Precision 2: 25.10", s); Streng s2 = String.format ("Output af generel konverteringstype med præcision 2:% .2b", sand); assertEquals ("Output af generel konverteringstype med Precision 2: tr", s2); }

7. Argumentindeks

Som nævnt tidligere harargument_index er et heltal, der angiver placeringen af ​​argumentet i argumentlisten. 1$ angiver det første argument, 2$ det andet argument osv.

Der er også en anden måde at henvise til argumenter efter position ved hjælp af ‘<‘ (‘\ U003c ') flag, hvilket betyder, at argumentet fra den forrige formatspecifikator genbruges. For eksempel vil disse to udsagn producere den samme output:

@Test offentlig ugyldigt nårSpecifyArgumentIndex_thenGotExpected () {Kalender c = Calendar.getInstance (); Streng s = String.format ("Datoen er:% tm% 1 $ te,% 1 $ tY", c); assertEquals ("Datoen er: 12 10,2017", s); s = String.format ("Datoen er:% tm%<>

8. Andre måder at bruge på Formater

Indtil nu så vi brugen af format() metode til Formater klasse. Vi kan også oprette en Formater eksempel, og brug det til at påberåbe sig format() metode.

Vi kan oprette en instans ved at sende en Kan tilføjes, OutputStream, Fil eller filnavn. Baseret på dette er det formaterede Snor er gemt i en Kan tilføjes, OutputStream, Fil henholdsvis.

Lad os se et eksempel på at bruge det med en Kan tilføjes. Vi kan bruge det med andre på samme måde.

8.1. Ved brug af Formater Med Kan tilføjes

Lad os oprette en StringBuilder eksempel sb, og opret en Formater bruger det. Så påberåber vi os format() at formatere en Snor:

@Test offentlig ugyldig nårCreateFormatter_thenFormatterWithAppendable () {StringBuilder sb = ny StringBuilder (); Formater formatering = ny formatering (sb); formatter.format ("Jeg skriver til en% s instans.", sb.getClass ()); assertEquals ("Jeg skriver til en klasse java.lang.StringBuilder Instance.", sb.toString ()); }

9. Konklusion

I denne artikel så vi formateringsfaciliteterne leveret af java.util.Formater klasse. Vi så forskellige syntaks, der kan bruges til at formatere Snor og de konverteringstyper, der kan bruges til forskellige datatyper.

Som sædvanlig kan koden til de eksempler, vi så, findes på Github.