Vodič za java.util.Formatter

1. Pregled

U ovom ćemo članku razgovarati o Niz formatiranje u Javi pomoću java.util.Formatter klase, koja pruža podršku za opravdanje i poravnanje izgleda.

2. Kako se koristi Formatter

Sjetite se C-a printf? Oblikovanje a Niz u Javi se osjeća vrlo slično.

The format() metoda Formatter je izložen statičkom metodom iz Niz razred. Ova metoda prihvaća predložak Niz i popis argumenata za popunjavanje predloška:

String pozdravi = String.format ("Pozdrav narode, dobrodošli u% s!", "Baeldung");

Dobivena Niz je:

"Pozdrav narode, dobrodošli u Baeldung!"

Predložak je Niz koji sadrži neki statični tekst i jedan ili više specifikatora formata, koji ukazuju koji argument treba postaviti na određeno mjesto.

U ovom slučaju, postoji jedan specifikator formata % s, koji se zamjenjuje odgovarajućim argumentom.

3. Specifikacije formata

3.1. Opća sintaksa

Sintaksa specifikatora formata za Općenito, Karakter, i Numerički vrsta je:

% [argument_index $] [zastavice] [širina] [. preciznost] pretvorba

Specifikatori argument_index, zastava, širina, i preciznost nisu obvezni.

  • argument_index dio je cijeli broj ja - što ukazuje da je i ovdje treba upotrijebiti argument s popisa argumenata
  • zastave je skup znakova koji se koristi za izmjenu izlaznog formata
  • širina je pozitivan cijeli broj koji označava minimalni broj znakova koji se upisuju u izlaz
  • preciznost je cijeli broj koji se obično koristi za ograničavanje broja znakova, čije specifično ponašanje ovisi o pretvorbi
  • je obvezni dio. To je znak koji pokazuje kako treba formatirati argument. Skup valjanih pretvorbi za zadani argument ovisi o vrsti podataka argumenta

U našem gornjem primjeru, ako želimo eksplicitno odrediti broj argumenta, možemo ga napisati pomoću 1$ i 2$ indeksi argumenata.

Oba su prvi i drugi argument:

String pozdravi = String.format ("Pozdrav% 2 $ s, dobrodošli u% 1 $ s!", "Baeldung", "Folks");

3.2. Za Datum vrijeme Zastupanje

Pretvorba% [argument_index $] [zastavice] [širina]

Opet argument_index, zastave, i širina nisu obvezni.

Uzmimo primjer da to shvatimo:

@Test public void whenFormatSpecifierForCalendar_thenGotExpected () {Kalendar c = novi GregorianCalendar (2017, 11, 10); String s = String.format ("Datum je:% tm% 1 $ te,% 1 $ tY", c); assertEquals ("Datum je: 12. 10. 2017.", s); }

Ovdje će se za svaki specifikator formata koristiti 1. argument, dakle 1$. Ovdje ako preskočimo argument_index za 2. i 3. specifikator formata pokušava pronaći 3 argumenta, ali trebamo koristiti isti argument za sva 3 specifikatora formata.

Dakle, u redu je ako ne navedemo argument _index za prvu, ali moramo je navesti za ostale dvije.

The zastava ovdje se sastoji od dva znaka. Gdje je prvi znak uvijek a 'T' ili "T". Drugi lik ovisi o tome koji dio Kalendar treba prikazati.

U našem primjeru, prvi specifikatori formata tm, označava mjesec formatiran kao dvije znamenke, te označava dan u mjesecu i tY označena Godina oblikovana u obliku četiri znamenke.

3.3. Specifikatori formata bez argumenata

Pretvorba% [zastavice] [širina]

Neobvezno zastave i širina su isti kao što je definirano u gornjim odjeljcima.

Potrebno pretvorba je lik ili Niz označavajući sadržaj koji će se umetnuti u izlaz. Trenutno je samo ‘%' i novi red 'N' može se ispisati pomoću ovog:

@Test public void whenNoArguments_thenExpected () {String s = String.format ("John je postigao 90 %% u jesenskom semestru"); assertEquals ("John je postigao 90% u jesenskom semestru", s); } 

Iznutra format(), ako želimo tiskati ‘%' - moramo pobjeći korištenjem ‘%%'.

4. Konverzije

Istražimo sada sve pojedinosti sintakse Specifikatora formata, počevši od pretvorba. Imajte na umu da sve detalje možete pronaći u Formatter javadocs.

Kao što smo primijetili u gornjim primjerima, pretvorba dio je potreban u svim specifikatorima formata, a može se podijeliti u nekoliko kategorija.

Pogledajmo svaku uzimanjem primjera.

4.1. Općenito

Koristi se za bilo koju vrstu argumenta. Općenite pretvorbe su:

  1. "B" ili "B" - za Booleova vrijednosti
  2. ‘H’ ili "H" - za HashCode
  3. 'S' ili "S" - za Niz, ako null, ispisuje "null", inače arg.toString ()

Sada ćemo pokušati prikazati boolean i Niz vrijednosti, koristeći odgovarajuće pretvorbe:

@Test javna praznina givenString_whenGeneralConversion_thenConvertedString () {String s = String.format ("Točan odgovor je% s", false); assertEquals ("Točan odgovor je netačan", s); s = String.format ("Točan odgovor je% b", null); assertEquals ("Točan odgovor je netačan", s); s = String.format ("Točan odgovor je% B", točno); assertEquals ("Točan odgovor je ISTINA", s); }

4.2. Lik

Koristi se za osnovne tipove koji predstavljaju Unicode znakove: char, Znak, bajt, Bajt, kratki, i Kratak. Ova se pretvorba može koristiti i za vrste int i Cijeli broj kada Character.isValidCodePoint (int) vraća se pravi za njih.

Može se zapisati kao "C" ili ‘C’ na osnovu slučaja koji želimo.

Pokušajmo ispisati neke znakove:

@Test javna praznina givenString_whenCharConversion_thenConvertedString () {String s = String.format ("Točan odgovor je% c", 'a'); assertEquals ("Točan odgovor je a", s); s = String.format ("Točan odgovor je% c", null); assertEquals ("Točan odgovor je null", s); s = String.format ("Točan odgovor je% C", 'b'); assertEquals ("Točan odgovor je B", s); s = String.format ("Važeći unicode znak:% c", 0x0400); assertTrue (Character.isValidCodePoint (0x0400)); assertEquals ("Važeći unicode znak: Ѐ", s); }

Uzmimo još jedan primjer nevaljane kodne točke:

@Test (očekuje se = IllegalFormatCodePointException.class) javna void kadaIllegalCodePointForConversion_thenError () {String s = String.format ("Važeći unicode znak:% c", 0x11FFFF); assertFalse (Character.isValidCodePoint (0x11FFFF)); assertEquals ("Važeći unicode znak: Ā", s); }

4.3. Numerički - Sastavni

Oni se koriste za Java integralne tipove: bajt, Bajt, kratki, kratki, međ i Cijelo, dugo, dugo, i BigInteger. U ovoj kategoriji postoje tri konverzije:

  1. "D" - za decimalni broj
  2. "O" - za oktalni broj
  3. 'X' ili 'x' - za heksadecimalni broj

Pokušajmo ispisati svaku od ovih:

@Test public void whenNumericIntegralConversion_thenConvertedString () {String s = String.format ("Broj 25 u decimalnom =% d", 25); assertEquals ("Broj 25 u decimalnom = 25", s); s = String.format ("Broj 25 u osmici =% o", 25); assertEquals ("Broj 25 u osmici = 31", s); s = String.format ("Broj 25 u heksadecimalnom =% x", 25); assertEquals ("Broj 25 u heksadecimalnom = 19", s); }

4.4. Numerički - plutajuća točka

Koristi se za Java vrste s pomičnom zarezom: plutaju, plutaju, dvostruko, dvostruko, i BigDecimal

  1. "E" ili "E"oblikovan kao decimalni broj u računalnoj znanstvenoj notaciji
  2. "F"oblikovan kao decimalni broj
  3. "G" ili "G"na temelju vrijednosti preciznosti nakon zaokruživanja, ova pretvorba formatira se u računalni znanstveni zapis ili decimalni format

Pokušajmo ispisati brojeve s pomičnom zarezom:

@Test public void whenNumericFloatingConversion_thenConvertedString () {String s = String.format ("Računalni znanstveni format od 10000,00" + "=% e", 10000,00); assertEquals ("Računalni znanstveni format od 10000,00 = 1.000000e + 04", s); Niz s2 = String.format ("Decimalni format 10.019 =% f", 10.019); assertEquals ("Decimalni format 10,019 = 10,019000", s2); }

4.5. Ostale konverzije

  • Datum vrijeme - za Java tipove koji mogu kodirati datum ili vrijeme: dugo, dugo, kalendar, Datum i TemporalAccessor. Za to trebamo koristiti prefiks 'T' ili "T", kao što smo vidjeli ranije
  • Postotak - ispisuje doslovno "%" ("\ U0025")
  • Razdjelnik linija - ispisuje separator linija specifičan za platformu

Pogledajmo jednostavan primjer:

@Test public void whenLineSeparatorConversion_thenConvertedString () {String s = String.format ("First Line% nSecond Line"); assertEquals ("Prvi redak \ n" + "Drugi redak", s); }

5. Zastave

Općenito se zastave koriste za formatiranje rezultata. Dok se u slučaju datuma i vremena koriste za određivanje dijela datuma koji će se prikazati, kao što smo vidjeli u primjeru iz odjeljka 4.

Dostupan je niz zastava čiji se popis može naći u dokumentaciji.

Pogledajmo primjer zastave kako bismo shvatili da se koristi. ‘-‘ koristi se za oblikovanje izlaza poravnato lijevo:

@Test public void whenSpecifyFlag_thenGotFormattedString () {String s = String.format ("Bez lijeve poravnave zastavice:% 5d", 25); assertEquals ("Bez lijeve opravdane zastavice: 25", s); s = String.format ("S poravnatom lijevom zastavicom:% -5d", 25); assertEquals ("S poravnatom lijevom zastavicom: 25", s); }

6. Preciznost

Za opće pretvorbe, preciznost je samo maksimalni broj znakova koji se upisuje u izlaz. Dok je f ili pretvorba s pomičnom zarezom, preciznost je broj znamenki nakon radiksne točke.

Prva je izjava primjer preciznosti s brojevima s pomičnom zarezom, a druga s općenitim pretvorbama:

@Test public void whenSpecifyPrecision_thenGotExpected () {String s = String.format ("Izlaz od 25.09878 s preciznošću 2:% .2f", 25.09878); assertEquals ("Izlaz od 25.09878 s preciznošću 2: 25.10", s); String s2 = String.format ("Izlaz općeg tipa pretvorbe s Precision 2:% .2b", točno); assertEquals ("Izlaz općeg tipa pretvorbe s Precision 2: tr", s2); }

7. Argument Index

Kao što je prethodno spomenuto,argument_index je cijeli broj koji označava položaj argumenta na popisu argumenata. 1$ označava prvi argument, 2$ drugi argument i tako dalje.

Također, postoji još jedan način referenciranja argumenata pomoću položaja pomoću ‘<‘ (‘\ U003c ') zastava, što znači da će se argument iz prethodnog specifikatora formata ponovno koristiti. Na primjer, ove bi dvije izjave dale identičan rezultat:

@Test public void whenSpecifyArgumentIndex_thenGotExpected () {Calendar c = Calendar.getInstance (); String s = String.format ("Datum je:% tm% 1 $ te,% 1 $ tY", c); assertEquals ("Datum je: 12. 10. 2017.", s); s = String.format ("Datum je:% tm%<>

8. Ostali načini korištenja Formatter

Do sada smo vidjeli upotrebu format() metoda Formatter razred. Također možemo stvoriti i Formatter instancu i upotrijebite to za pozivanje datoteke format() metoda.

Instancu možemo stvoriti dodavanjem datoteke Napadljivo, Izlazni tok, Datoteka ili naziv datoteke. Na temelju toga formatirano Niz je pohranjena u Napadljivo, Izlazni tok, Datoteka odnosno.

Pogledajmo primjer njegove upotrebe s Napadljivo. Na isti ga način možemo koristiti s drugima.

8.1. Koristeći Formatter S Napadljivo

Stvorimo StringBuilder primjer sbi stvorite a Formatter koristeći ga. Tada ćemo se zazivati format() formatirati a Niz:

@Test public void whenCreateFormatter_thenFormatterWithAppendable () {StringBuilder sb = novi StringBuilder (); Formatter formatter = novi Formatter (sb); formatter.format ("Pišem u instancu% s.", sb.getClass ()); assertEquals ("Pišem u klasu java.lang.StringBuilder Instance.", sb.toString ()); }

9. Zaključak

U ovom smo članku vidjeli mogućnosti formatiranja koje nudi java.util.Formatter razred. Vidjeli smo različite sintakse koje se mogu koristiti za formatiranje Niz i vrste pretvorbe koje se mogu koristiti za različite tipove podataka.

Kao i obično, kod za primjere koje smo vidjeli nalazi se na Githubu.