Praktický sprievodca pre DecimalFormat

1. Prehľad

V tomto článku sa chystáme preskúmať DecimalFormat triedy spolu s jej praktickým využitím.

Toto je podtrieda NumberFormat, ktorý umožňuje formátovanie desatinných čísel ' String reprezentácia pomocou preddefinovaných vzorov.

Môže sa tiež použiť inverzne na analýzu reťazcov na čísla.

2. Ako to funguje?

Aby sme mohli formátovať číslo, musíme definovať vzor, ​​ktorý je postupnosťou špeciálnych znakov potenciálne zmiešaných s textom.

K dispozícii je 11 znakov špeciálneho vzoru, ale najdôležitejšie sú:

  • 0 - vytlačí číslicu, ak je poskytnutá, inak 0
  • # - vytlačí číslicu, ak je poskytnutá, inak nič
  • . - uveďte, kam umiestniť desatinný oddeľovač
  • , - uveďte, kam umiestniť oddeľovač zoskupenia

Keď sa vzor použije na číslo, vykonajú sa jeho pravidlá formátovania a výsledok sa vytlačí podľa DecimalFormatSymbol našich JVM Miestne nastavenie pokiaľ nie je konkrétny Miestne nastavenie je zadané.

Výstupy nasledujúcich príkladov pochádzajú z JVM bežiacich v angličtine Miestne nastavenie.

3. Základné formátovanie

Pozrime sa teraz, ktoré výstupy sa vytvárajú pri formátovaní rovnakého počtu s nasledujúcimi vzormi.

3.1. Jednoduché desatinné miesta

dvojité d = 1234567,89; assertThat (nový DecimalFormat ("#. ##"). formát (d)). isEqualTo ("1234567,89"); assertThat (nový DecimalFormat ("0,00"). formát (d)). isEqualTo ("1234567,89"); 

Ako vidíme, celočíselná časť sa nikdy nezruší, bez ohľadu na to, či je vzor menší ako číslo.

assertThat (nový DecimalFormat ("##########. ###"). formát (d)) .isEqualTo ("1234567,89"); assertThat (new DecimalFormat ("000000000.000"). format (d)) .isEqualTo ("001234567.890"); 

Ak je vzor namiesto toho väčší ako číslo, pridajú sa nuly, zatiaľ čo hodnoty hash sa vypustia, a to v celom čísle aj v desatinných častiach.

3.2. Zaokrúhľovanie

Ak desatinná časť vzoru nemôže obsahovať celú presnosť vstupného čísla, zaokrúhli sa.

Tu bola 0,89 časť zaokrúhlená na 0,90, potom bola vynechaná 0:

assertThat (nový DecimalFormat ("#. #"). formát (d)) .isEqualTo ("1234567.9"); 

Tu sa 0,89 časť zaokrúhli na 1,00, potom sa 0,00 vypustí a 1 sa spočíta na 7:

assertThat (nový DecimalFormat ("#"). formát (d)) .isEqualTo ("1234568"); 

Predvolený režim zaokrúhľovania je HALF_EVEN, ale dá sa prispôsobiť cez setRoundingMode metóda.

3.3. Zoskupenie

Oddeľovač zoskupení sa používa na zadanie podvzorca, ktorý sa automaticky opakuje:

assertThat (nový DecimalFormat ("#, ###. #"). formát (d)) .isEqualTo ("1 234 567,9"); assertThat (nový DecimalFormat ("#, ###"). formát (d)) .isEqualTo ("1 234 568"); 

3.4. Viacero vzorov zoskupovania

Niektoré krajiny majú vo svojich systémoch číslovania premenlivý počet vzorov zoskupovania.

Indický číselný systém používa formát #, ##, ###. ##, v ktorom iba prvý oddeľovač zoskupenia obsahuje tri čísla, zatiaľ čo všetky ostatné obsahujú dve čísla.

To nie je možné dosiahnuť použitím DecimalFormat trieda, ktorá zachováva iba najnovší vzor, ​​na ktorý narazíte zľava doprava, a aplikuje ho na celé číslo, pričom ignoruje predchádzajúce zoskupovacie vzory.

Pokus o použitie vzoru #, ##, ##, ##, ### by viedol k preskupeniu na ########, ### a skončil by opätovným rozdelením na #, ###, # ##, ###.

Na dosiahnutie viacnásobného zoskupovania vzorov je potrebné napísať náš vlastný String manipulačný kód alebo alternatívne vyskúšať Icu4J DecimalFormat, ktorý to umožňuje.

3.5. Miešanie strunových literálov

Je to možné zmiešať String literály v rámci vzoru:

assertThat (novy DecimalFormat ("# cislo") .format (d)) .isEqualTo ("cislo 1234568"); 

Je tiež možné použiť špeciálne znaky ako String literály, uniknutím:

assertThat (nový DecimalFormat ("The '#' # number") .format (d)) .isEqualTo ("The # 1234568 number"); 

4. Lokalizované formátovanie

Mnoho krajín nepoužíva anglické symboly a čiarku používa ako oddeľovač desatinných miest a bodku ako oddeľovač zoskupení.

Spustenie vzoru #, ###. ## na JVM s taliančinou Miestne nastavenienapríklad, vyprodukuje 1,234,567,89.

Aj keď by to v niektorých prípadoch mohla byť užitočná funkcia i18n, v iných by sme mohli chcieť presadiť konkrétny formát nezávislý od JVM.

Môžeme to urobiť takto:

assertThat (nový DecimalFormat ("#, ###. ##", nový DecimalFormatSymbols (Locale.ENGLISH)). formát (d)) .isEqualTo ("1 234 567,89"); assertThat (nový DecimalFormat ("#, ###. ##", nový DecimalFormatSymbols (Locale.ITALIAN)). formát (d)) .isEqualTo ("1,234,567,89"); 

Ak Miestne nastavenie nás zaujíma, nie je medzi tými, na ktoré sa vzťahuje Symboly DecimalFormat konštruktora, môžeme ho určiť pomocou getInstance metóda:

Locale customLocale = new Locale ("it", "IT"); assertThat (new DecimalFormat ("#, ###. ##", DecimalFormatSymbols.getInstance (customLocale)). format (d)) .isEqualTo ("1.234.567,89");

5. Vedecké zápisy

Vedecká notácia predstavuje produkt mantisy a exponent desiatich. Číslo 1234567.89 možno tiež vyjadriť ako 12.3456789 * 10 ^ 5 (bodka je posunutá o 5 pozícií).

5.1. E-Poznámka

Vo vedeckej notácii je možné vyjadriť číslo pomocou E znak vzoru predstavujúci exponent desiatich:

assertThat (nový DecimalFormat ("00. ####### E0"). formát (d)) .isEqualTo ("12.3456789E5"); assertThat (novy DecimalFormat ("000.000000E0"). format (d)) .isEqualTo ("123.456789E4"); 

Mali by sme mať na pamäti, že počet znakov za exponentom je relevantný, takže ak potrebujeme vyjadriť 10 ^ 12, musíme E00 a nie E0.

5.2. Inžinierska notácia

Je bežné používať konkrétnu formu vedeckej notácie nazvanú Engineering Notation, ktorá upravuje výsledky tak, aby boli vyjadrené ako násobok troch, napríklad pri použití meracích jednotiek ako Kilo (10 ^ 3), Mega (10 ^ 6), Giga ( 10 ^ 9) atď.

Tento druh zápisu môžeme vynútiť úpravou maximálneho počtu celočíselných číslic (znaky vyjadrené znakom # a naľavo od oddeľovača desatinných miest) tak, aby bol vyšší ako minimálny počet (ten vyjadrený nulou) a vyšší ako 1.

Toto prinúti exponenta, aby bol násobkom maximálneho počtu, takže pre tento prípad použitia chceme, aby bol maximálny počet tri:

assertThat (nový DecimalFormat ("## 0. ###### E0") .formát (d)). isEqualTo ("1.23456789E6"); assertThat (nový DecimalFormat ("###. 000000E0") .formát (d)). isEqualTo ("1.23456789E6"); 

6. Analýza

Pozrime sa, ako je možné analyzovať a String do a Číslo metódou analýzy:

assertThat (new DecimalFormat ("", new DecimalFormatSymbols (Locale.ENGLISH)) .parse ("1234567.89")) .isEqualTo (1234567.89); assertThat (new DecimalFormat ("", new DecimalFormatSymbols (Locale.ITALIAN)) .parse ("1.234.567,89"))) .isEqualTo (1234567.89);

Pretože vrátená hodnota nie je odvodená prítomnosťou desatinného oddeľovača, môžeme použiť metódy ako .doubleValue (), .longValue () vrátených Číslo objekt na vynútenie konkrétneho primitívu vo výstupe.

Môžeme tiež získať a BigDecimal nasledovne:

NumberFormat nf = new DecimalFormat ("", new DecimalFormatSymbols (Locale.ENGLISH)); ((DecimalFormat) nf) .setParseBigDecimal (true); assertThat (nf.parse ("1234567.89")) .isEqualTo (BigDecimal.valueOf (1234567.89)); 

7. Bezpečnosť závitov

DecimalFormat nie je bezpečný pre vlákna, preto by sme mali venovať osobitnú pozornosť pri zdieľaní tej istej inštancie medzi vláknami.

8. Záver

Videli sme hlavné spôsoby použitia DecimalFormat triedy spolu s jej silnými a slabými stránkami.

Celý zdrojový kód je ako vždy k dispozícii na stránkach Github.


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