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ú:

  1. „B“ alebo „B“ - pre Boolovský hodnoty
  2. „H“ alebo „H“ - pre HashCode
  3. „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:

  1. ‘D’ - pre desatinné číslo
  2. „O“ - pre osmičkové číslo
  3. '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

  1. „E“ alebo „E“formátovaný ako desatinné číslo v automatizovanej vedeckej notácii
  2. „F“formátovaný ako desatinné číslo
  3. „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.


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