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:
- "B" ili "B" - za Booleova vrijednosti
- ‘H’ ili "H" - za HashCode
- '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:
- "D" - za decimalni broj
- "O" - za oktalni broj
- '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
- "E" ili "E" – oblikovan kao decimalni broj u računalnoj znanstvenoj notaciji
- "F" – oblikovan kao decimalni broj
- "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.