Formátovanie čísla v Jave

1. Prehľad

V tomto tutoriáli sa pozrieme na rôzne prístupy k formátovaniu čísel v Jave a na ich implementáciu.

2. Základné formátovanie čísla pomocou Formát reťazca #

The Formát reťazca # metóda je veľmi užitočná na formátovanie čísel. Metóda vyžaduje dva argumenty. Prvý argument popisuje vzorec, koľko desatinných miest chceme vidieť, a druhý argument je zadaná hodnota:

dvojnásobná hodnota = 4,2352989244d; assertThat (String.format ("%. 2f", hodnota)). isEqualTo ("4,24"); assertThat (String.format ("%. 3f", hodnota)). isEqualTo ("4.235");

3. Desatinné formátovanie zaokrúhľovaním

V Jave máme dva primitívne typy, ktoré predstavujú desatinné číslaplavák a desatinný:

double myDouble = 7,8723d; float myFloat = 7,8723f;

Počet desatinných miest sa môže líšiť v závislosti od vykonávaných operácií. Vo väčšine prípadov nás zaujíma iba prvých pár desatinných miest. Pozrime sa na niekoľko spôsobov, ako formátovať desatinné miesto zaokrúhľovaním.

3.1. Použitím BigDecimal pre formátovanie čísel

The BigDecimal trieda poskytuje metódy zaokrúhľovania na zadaný počet desatinných miest. Vytvorme pomocnú metódu, ktorá vráti dvojnásobok zaokrúhlený na požadovaný počet miest:

public static double withBigDecimal (double value, int places) {BigDecimal bigDecimal = new BigDecimal (value); bigDecimal = bigDecimal.setScale (places, RoundingMode.HALF_UP); return bigDecimal.doubleValue (); }

Začíname s novou inštanciou BigDecimal s našou pôvodnou desatinnou hodnotou. Potom, nastavením mierky poskytneme počet desatinných miest, ktorý chceme, a spôsob, akým chceme naše číslo zaokrúhliť. Používanie tejto metódy nám umožňuje ľahko formátovať a dvojitý hodnota:

dvojité D = 4,2352989244d; assertThat (withBigDecimal (D, 2)). isEqualTo (4,24); assertThat (withBigDecimal (D, 3)). isEqualTo (4,235);

3.2. Použitím Matematika # okrúhla

Môžeme tiež využiť výhody statických metód v Matematika trieda zaokrúhliť a dvojitý hodnotu na zadané desatinné miesto. V takom prípade môžeme upravte počet desatinných miest vynásobením a neskorším vydelením 10 ^ n. Poďme skontrolovať našu pomocnú metódu:

public static double withMathRound (double value, int places) {double scale = Math.pow (10, places); návrat Math.round (hodnota * stupnica) / stupnica; }
assertThat (withMathRound (D, 2)). isEqualTo (4,24); assertThat (withMathRound (D, 3)). isEqualTo (4,235);

Tento spôsob sa však odporúča iba v konkrétnych prípadoch, pretože výstup môže byť niekedy zaokrúhlený inak, ako sa očakávalo pred tlačou.

To je preto, že Matematika # okrúhla skracuje hodnotu. Pozrime sa, ako sa to môže stať:

System.out.println (withMathRound (1000.0d, 17)); // Dáva: 92,23372036854776 !! System.out.println (withMathRound (260.775d, 2)); // Dáva: 260,77 namiesto očakávaných 260,78 

Metóda je teda uvedená iba na účely výučby.

4. Formátovanie rôznych typov čísel

V niektorých konkrétnych prípadoch možno budeme chcieť formátovať číslo pre konkrétny typ, ako je mena, veľké celé číslo alebo percento.

4.1. Formátovanie veľkých celých čísel s čiarkami

Kedykoľvek máme v našej aplikácii veľké celé číslo, môžeme ho chcieť zobraziť čiarkami pomocou DecimalFormat s preddefinovaným vzorom:

public static String withLargeIntegers (double value) {DecimalFormat df = new DecimalFormat ("###, ###, ###"); návrat df.formát (hodnota); } int hodnota = 123456789; assertThat (withLargeIntegers (hodnota)). isEqualTo ("123 456 789");

4.2. Polstrovanie čísla

V niektorých prípadoch možno budeme chcieť zadať číslo nulami pre zadanú dĺžku. Tu môžeme použiť Formát reťazca # vyššie opísanou metódou:

public static String byPaddingZeros (int hodnota, int paddingLength) {return String.format ("% 0" + paddingLength + "d", hodnota); } int hodnota = 1; assertThat (byPaddingOutZeros (hodnota, 3)). isEqualTo ("001");

4.3. Formátovanie čísel s dvoma nulami po desatinnej čiarke

Aby sme mohli vytlačiť ľubovoľné dané číslo s dvoma nulami za desatinnou čiarkou, použijeme ešte jedenkrát DecimalFormat trieda s preddefinovaným vzorom:

public static double withTwoDecimalPlaces (double value) {DecimalFormat df = new DecimalFormat ("#. 00"); vrátiť nový Double (df.format (hodnota)); } int hodnota = 12; assertThat (withTwoDecimalPlaces (hodnota)). isEqualTo (12,00);

V tomto prípade, vytvorili sme nový formát so vzorom určujúcim dve nuly za desatinnou čiarkou.

4.4. Formátovanie a percentá

Možno budeme občas musieť zobraziť percentá.

V takom prípade môžeme použiť NumberFormat #getPercentInstance metóda. Táto metóda nám umožňuje poskytnúť a Miestne nastavenie vytlačiť hodnotu vo formáte, ktorý je správny pre zadanú krajinu:

public static String forPercentages (double value, Locale locale) {NumberFormat nf = NumberFormat.getPercentInstance (locale); návrat nf.formát (hodnota); } dvojnásobná hodnota = 25f / 100f; assertThat (forPercentages (value, new Locale ("en", "US"))). isEqualTo ("25%");

4.5. Formátovanie čísla meny

Bežným spôsobom ukladania mien v našej aplikácii je použitie BigDecimal. Čo ak ich chceme zobraziť používateľovi? V takom prípade môžeme použiť NumberFormat trieda:

public static String currencyWithChosenLocalisation (dvojitá hodnota, miestne nastavenie miestneho prostredia) {NumberFormat nf = NumberFormat.getCurrencyInstance (miestne nastavenie); návrat nf.formát (hodnota); }

Dostaneme inštanciu meny pre danú Miestne nastavenie a potom jednoducho zavolajte formát metóda s hodnotou. Výsledkom je číslo zobrazené ako mena pre zadanú krajinu:

dvojnásobná hodnota = 23_500; assertThat (currencyWithChosenLocalisation (hodnota, nové miestne nastavenie ("en", "US"))). isEqualTo ("23 500,00 dolárov"); assertThat (currencyWithChosenLocalisation (hodnota, nové miestne nastavenie ("zh", "CN"))). isEqualTo ("23 500,00"); assertThat (currencyWithChosenLocalisation (hodnota, nové miestne nastavenie ("pl", "PL"))). isEqualTo ("23 500 zł");

5. Prípady použitia pokročilého formátovania

DecimalFormat je jedným z najpopulárnejších spôsobov formátovania desatinného čísla v jazyku Java. Podobne ako v predchádzajúcich príkladoch napíšeme pomocnú metódu:

public static double withDecimalFormatLocal (double value) {DecimalFormat df = (DecimalFormat) NumberFormat.getNumberInstance (Locale.getDefault ()); vrátiť nový Double (df.format (hodnota)); }

Náš typ formátovania získa predvolené nastavenie pre danú lokalizáciu.

S desatinným formátovaním sa v rôznych krajinách pomocou ich numerických systémov zaobchádza odlišne. Napríklad znak zoskupenia (čiarka v USA, ale medzera alebo bodka v iných miestnych jazykoch), veľkosť zoskupenia (tri v USA a väčšina miestnych nastavení, ale odlišné v Indii) alebo desatinný znak (bodka v USA, ale čiarka na iných miestach).

dvojité D = 4,2352989244d; assertThat (withDecimalFormatLocal (D)). isEqualTo (4,235);

Túto funkcionalitu môžeme tiež rozšíriť tak, aby poskytovala niektoré konkrétne vzory:

public static double withDecimalFormatPattern (double value, int places) {DecimalFormat df2 = new DecimalFormat ("#, ###, ###, ## 0,00"); DecimalFormat df3 = nový DecimalFormat ("#, ###, ###, ## 0,000"); if (places == 2) return new Double (df2.format (value)); else if (places == 3) return new Double (df3.format (value)); else throw new IllegalArgumentException (); } assertThat (sDecimalFormatPattern (D, 2)). isEqualTo (4,24); assertThat (withDecimalFormatPattern (D, 3)). isEqualTo (4,235);

Tu umožňujeme nášmu používateľovi konfiguráciu DecimalFormat podľa zvoleného vzoru na základe počtu medzier.

6. Záver

V tomto článku sme si v krátkosti prešli rôznymi spôsobmi formátovania čísel v Jave. Ako vidíme, neexistuje žiadny najlepší spôsob, ako to urobiť. Možno postupovať podľa mnohých prístupov, pretože každý z nich má svoje vlastné charakteristické znaky.

Ako vždy, kód týchto príkladov je k dispozícii na GitHub.