Sprievodca po java.util.Formatter
1. Prehľad
V tomto článku si ukážeme String formátovanie v Jave pomocou java.util.Formatter triedy, ktorá poskytuje podporu pre zarovnanie a zarovnanie rozloženia.
2. Ako používať Formátovač
Pamätajte na C printf? Formátovanie a String v Jave sa cíti veľmi podobne.
The formát () metóda Formátovač je vystavený statickou metódou z String trieda. Táto metóda prijíma šablónu String a zoznam argumentov na vyplnenie šablóny:
String greetings = String.format ("Ahoj ľudia, vitajte na% s!", "Baeldung");
Výsledný String je:
„Ahoj ľudia, vitajte v Baeldungu!“
Šablóna je a String ktorá obsahuje statický text a jeden alebo viac špecifikátorov formátu, ktoré označujú, ktorý argument sa má umiestniť na konkrétnu pozíciu.
V tomto prípade, existuje jediný špecifikátor formátu % s, ktorý sa nahradí zodpovedajúcim argumentom.
3. Špecifikátory formátu
3.1. Všeobecná syntax
Syntax špecifikátorov formátu pre Generál, postava, a Numerické typ je:
% [argument_index $] [vlajky] [šírka] [. presnosť] konverzie
Špecifikátory argument_index, vlajka, sirkaa presnosť sú voliteľné.
- argument_index časť je celé číslo i - čo naznačuje, že i Tu by sa mal použiť argument zo zoznamu argumentov
- vlajky je sada znakov používaných na úpravu výstupného formátu
- šírka je kladné celé číslo, ktoré označuje minimálny počet znakov, ktoré sa majú zapísať na výstup
- presnosť je celé číslo zvyčajne používané na obmedzenie počtu znakov, ktorých konkrétne správanie závisí od prevodu
- je povinná časť. Je to znak označujúci, ako má byť argument naformátovaný. Sada platných prevodov pre daný argument závisí od údajového typu argumentu
V našom príklade vyššie, ak chceme explicitne určiť počet argumentov, môžeme ho napísať pomocou 1$ a 2$ argumentačné indexy.
Prvý aj druhý argument sú tieto:
String greetings = String.format ("Ahoj% 2 $ s, vitajte na% 1 $ s!", "Baeldung", "Folks");
3.2. Pre Dátum Čas Zastúpenie
% [argument_index $] [vlajky] [šírka] konverzie
Opäť argument_index, vlajkya šírka sú voliteľné.
Vezmime si príklad, aby sme tomu porozumeli:
@Test public void whenFormatSpecifierForCalendar_thenGotExected () {Calendar c = new GregorianCalendar (2017, 11, 10); String s = String.format ("Dátum je:% tm% 1 $ te,% 1 $ tY", c); assertEquals ("Dátum je: 12 10,2017", s); }
Tu sa teda pre každý špecifikátor formátu použije prvý argument 1$. Tu, ak preskočíme argument_index pre 2. a 3. špecifikátor formátu sa pokúsi nájsť 3 argumenty, musíme však použiť rovnaký argument pre všetky 3 špecifikátory formátu.
Takže, pokiaľ neurčíme, je to v poriadku argument _index pre prvý, ale musíme ho špecifikovať pre ďalšie dva.
The vlajka tu sa skladá z dvoch znakov. Kde je prvý znak vždy a Nie alebo „T“. Druhá postava závisí od toho, z ktorej časti Kalendár sa má zobraziť.
V našom príklade prvé špecifikátory formátu tm, označuje mesiac naformátovaný na dve číslice, te označuje deň v mesiaci a tY uvedený rok naformátovaný na štyri číslice.
3.3. Špecifikátory formátu bez argumentov
% [vlajky] [šírka] konverzie
Nepovinné vlajky a šírka sú rovnaké, ako sú definované vo vyššie uvedených častiach.
Požadované premena je postava alebo String označujúci obsah, ktorý sa má vložiť do výstupu. V súčasnej dobe iba ‘%' a nový riadok ‘N’ možno vytlačiť pomocou tohto:
@Test public void whenNoArguments_thenExected () {String s = String.format ("John zaznamenal v jesennom semestri 90 %%"); assertEquals („John dosiahol v jesennom semestri 90%“, s); }
Vo vnútri formát (), ak chceme tlačiť ‘%' - musíme tomu uniknúť pomocou ‘%%'.
4. Prepočty
Poďme sa teraz venovať všetkým detailom syntaxe špecifikátora formátu, počnúc od a premena. Upozorňujeme, že všetky podrobnosti nájdete v dokumente Formátovač javadocs.
Ako sme si všimli vo vyššie uvedených príkladoch, premena časť je vyžadovaná vo všetkých špecifikátoroch formátu a dá sa rozdeliť do niekoľkých kategórií.
Pozrime sa na každú z nich pomocou príkladov.
4.1. Všeobecné
Používa sa pre akýkoľvek typ argumentu. Všeobecné prevody sú:
- „B“ alebo „B“ - pre Boolovský hodnoty
- „H“ alebo „H“ - pre HashCode
- „S“ alebo „S“ - pre String, ak nulový, vytlačí „null“, inak arg.toString ()
Teraz sa pokúsime zobraziť boolovský a String hodnoty pomocou zodpovedajúcich prepočtov:
@Test public void givenString_whenGeneralConversion_thenConvertedString () {String s = String.format ("Správna odpoveď je% s", false); assertEquals ("Správna odpoveď je nepravdivá", s); s = String.format ("Správna odpoveď je% b", null); assertEquals ("Správna odpoveď je nepravdivá", s); s = String.format ("Správna odpoveď je% B", pravda); assertEquals ("Správna odpoveď je PRAVDA", s); }
4.2. Postava
Používa sa pre základné typy predstavujúce znaky Unicode: char, Character, byte, Byte, short, a Krátky. Túto premenu je možné použiť aj pre typy int a Celé číslo keď Character.isValidCodePoint (int) vracia pravda pre nich.
Môže byť napísané ako „C“ alebo „C“ na základe prípadu, ktorý chceme.
Skúsme vytlačiť niektoré znaky:
@Test public void givenString_whenCharConversion_thenConvertedString () {String s = String.format ("Správna odpoveď je% c", 'a'); assertEquals ("Správna odpoveď je a", s); s = String.format ("Správna odpoveď je% c", null); assertEquals ("Správna odpoveď je null", s); s = String.format ("Správna odpoveď je% C", 'b'); assertEquals ("Správna odpoveď je B", s); s = String.format ("Platný znak unicode:% c", 0x0400); assertTrue (Character.isValidCodePoint (0x0400)); assertEquals ("Platný znak unicode: Ѐ", s); }
Zoberme si ešte jeden príklad neplatného bodu kódu:
@Test (očakáva sa = IllegalFormatCodePointException.class) public void whenIllegalCodePointForConversion_thenError () {String s = String.format ("Platný znak unicode:% c", 0x11FFFF); assertFalse (Character.isValidCodePoint (0x11FFFF)); assertEquals ("Platný znak unicode: Ā", s); }
4.3. Číselné - Integrálne
Používajú sa pre integrálne typy Java: byte, Byte, short, Short, int a Celé číslo, dlhé, dlhé, a BigInteger. V tejto kategórii sa nachádzajú tri konverzie:
- ‘D’ - pre desatinné číslo
- „O“ - pre osmičkové číslo
- 'X' alebo 'X' - pre hexadecimálne číslo
Pokúsme sa vytlačiť každú z týchto možností:
@Test public void whenNumericIntegralConversion_thenConvertedString () {String s = String.format ("Číslo 25 v desatinnej =% d", 25); assertEquals ("Číslo 25 v desatinnej = 25", s); s = String.format ("Číslo 25 v osmičkovom tvare =% o", 25); assertEquals ("Číslo 25 v osmičkovej sústave = 31", s); s = String.format ("Číslo 25 v šestnástkovej sústave =% x", 25); assertEquals ("Číslo 25 v šestnástkovej sústave = 19", s); }
4.4. Číselné - pohyblivá desatina
Používa sa pre typy Java s pohyblivou rádovou čiarkou: plavák, plavák, dvojitý, dvojitý, a BigDecimal
- „E“ alebo „E“ – formátovaný ako desatinné číslo v automatizovanej vedeckej notácii
- „F“ – formátovaný ako desatinné číslo
- „G“ alebo „G“ – na základe hodnoty presnosti po zaokrúhlení sa táto konverzia formátuje do počítačového vedeckého zápisu alebo do desatinného formátu
Pokúsme sa vytlačiť čísla s pohyblivou rádovou čiarkou:
@Test public void whenNumericFloatingConversion_thenConvertedString () {String s = String.format ("Počítačový vedecký formát 10 000,00" + "=% e" 10 000,00); assertEquals ("Počítačový vedecký formát 10 000,00 = 1,000000e + 04", s); Reťazec s2 = String.format ("Desatinný formát 10.019 =% f", 10.019); assertEquals ("Desatinný formát 10.019 = 10.019000", s2); }
4.5. Ostatné konverzie
- Dátum Čas - pre typy Java, ktoré sú schopné kódovať dátum alebo čas: long, Long, Calendar, Dátum a TemporalAccessor. Na tento účel musíme použiť predponu Nie alebo „T“, ako sme videli skôr
- Percento - vytlačí doslovne „%“ („\ U0025“)
- Oddeľovač riadkov - vypíše oddeľovač riadkov pre konkrétnu platformu
Pozrime sa na jednoduchý príklad:
@Test public void whenLineSeparatorConversion_thenConvertedString () {String s = String.format ("Prvý riadok% nSecond Line"); assertEquals ("Prvý riadok \ n" + "Druhý riadok", s); }
5. Vlajky
Na formátovanie výstupu sa všeobecne používajú vlajky. Zatiaľ čo v prípade dátumu a času sa používajú na určenie, ktorá časť dátumu sa má zobraziť, ako sme videli v príklade v časti 4.
K dispozícii je niekoľko vlajok, ktorých zoznam nájdete v dokumentácii.
Pozrime sa na príklad vlajky, aby sme pochopili jeho použitie. ‘-‘ sa používa na formátovanie výstupu vľavo zarovnané:
@Test public void whenSpecifyFlag_thenGotFormattedString () {String s = String.format ("Bez ľavého príznaku:% 5d", 25); assertEquals ("Bez ľavého príznaku: 25", s); s = String.format ("S príznakom zarovnaným doľava:% -5d", 25); assertEquals ("S príznakom zarovnaným doľava: 25", s); }
6. Presnosť
Pre všeobecné konverzie presnosť je iba maximálny počet znakov, ktoré sa majú zapísať na výstup. Zatiaľ čo pri prepočtoch s pohyblivou rádovou čiarkou je presnosťou počet číslic za bodom radix.
Prvý príkaz je príkladom presnosti s číslami s pohyblivou rádovou čiarkou a druhý s všeobecnými prepočtami:
@Test public void whenSpecifyPrecision_thenGotExpected () {String s = String.format ("Výstup 25.09878 s presnosťou 2:% .2f", 25.09878); assertEquals ("Výstup 25.09878 s presnosťou 2: 25.10", s); String s2 = String.format ("Výstup bežného typu prevodu s Precision 2:% .2b", true); assertEquals ("Výstup všeobecného typu prevodu s presnosťou 2: tr", s2); }
7. Register argumentov
Ako už bolo spomenuté,argument_index je celé číslo, ktoré označuje pozíciu argumentu v zozname argumentov. 1$ označuje prvý argument, 2$ druhý argument atď.
Existuje tiež ďalší spôsob, ako odkazovať na argumenty podľa polohy, pomocou znaku „<“ („\ U003c“) príznak, čo znamená, že sa znova použije argument z predchádzajúceho špecifikátora formátu. Napríklad tieto dva príkazy by vytvorili rovnaký výstup:
@ Test public void whenSpecifyArgumentIndex_thenGotExected () {Calendar c = Calendar.getInstance (); String s = String.format ("Dátum je:% tm% 1 $ te,% 1 $ tY", c); assertEquals ("Dátum je: 12 10,2017", s); s = String.format ("Dátum je:% tm%<>
8. Ďalšie spôsoby použitia Formátovač
Doteraz sme videli použitie formát () metóda Formátovač trieda. Môžeme tiež vytvoriť a Formátovač inštanciu a pomocou nej vyvolať súbor formát () metóda.
Inštanciu môžeme vytvoriť odovzdaním znaku Pripojiteľné, OutputStream, Súbor alebo názov súboru. Na základe toho formátovaný String je uložený v Pripojiteľné, OutputStream, Súbor resp.
Pozrime sa na príklad použitia s Pripojiteľné. Môžeme ho použiť s ostatnými rovnako.
8.1. Použitím Formátovač S Pripojiteľné
Vytvorme StringBuilder inštancia sba vytvorte Formátovač pomocou toho. Potom sa dovoláme formát () formátovať a String:
@Test public void whenCreateFormatter_thenFormatterWithAppendable () {StringBuilder sb = nový StringBuilder (); Formátovač formátovač = nový formátovač (sb); formatter.format ("Píšem do inštancie% s.", sb.getClass ()); assertEquals ("Píšem do triedy java.lang.StringBuilder Instance.", sb.toString ()); }
9. Záver
V tomto článku sme videli možnosti formátovania poskytované serverom java.util.Formatter trieda. Videli sme rôzne syntaxe, ktoré je možné použiť na formátovanie súboru String a typy konverzií, ktoré sa dajú použiť pre rôzne typy údajov.
Ako obvykle, kód príkladov, ktoré sme videli, nájdete na Githube.