Oblikovanje brojeva u Javi

1. Pregled

U ovom ćemo uputstvu razmotriti različite pristupe formatiranju brojeva u Javi i kako ih primijeniti.

2. Osnovno formatiranje brojeva pomoću String # format

The String # format metoda vrlo je korisna za formatiranje brojeva. Metoda uzima dva argumenta. Prvi argument opisuje uzorak broja decimala koja želimo vidjeti, a drugi argument je dana vrijednost:

dvostruka vrijednost = 4,2352989244d; assertThat (String.format ("%. 2f", vrijednost)). isEqualTo ("4.24"); assertThat (String.format ("%. 3f", vrijednost)). isEqualTo ("4.235");

3. Formiranje decimala zaokruživanjem

U Javi imamo dva primitivna tipa koji predstavljaju decimalne brojeveplutati i decimal:

dvostruki myDouble = 7,8723d; float myFloat = 7.8723f;

Broj decimalnih mjesta može biti različit, ovisno o operacijama koje se izvode. U većini slučajeva zanimaju nas samo prvih nekoliko decimalnih mjesta. Pogledajmo neke načine oblikovanja decimalnog znaka zaokruživanjem.

3.1. Koristeći BigDecimal za oblikovanje brojeva

The BigDecimal klasa pruža metode za zaokruživanje na određeni broj decimalnih mjesta. Stvorimo pomoćnu metodu koja će vratiti dvostruko, zaokruženo na željeni broj mjesta:

javni statički double saBigDecimal (dvostruka vrijednost, int mjesta) {BigDecimal bigDecimal = novi BigDecimal (vrijednost); bigDecimal = bigDecimal.setScale (mjesta, RoundingMode.HALF_UP); vrati bigDecimal.doubleValue (); }

Počinjemo s novom instancom BigDecimal s našom izvornom decimalnom vrijednošću. Zatim, postavljanjem ljestvice pružamo broj decimalnih mjesta koji želimo i kako želimo zaokružiti svoj broj. Korištenje ove metode omogućuje nam jednostavno oblikovanje a dvostruko vrijednost:

dvostruki D = 4,2352989244d; assertThat (withBigDecimal (D, 2)). isEqualTo (4.24); assertThat (withBigDecimal (D, 3)). isEqualTo (4.235);

3.2. Koristeći Matematika # kolo

Također možemo iskoristiti statičke metode u Matematika razred zaokružiti a dvostruko vrijednost na određeno decimalno mjesto. U ovom slučaju možemo prilagodite broj decimalnih mjesta množenjem i kasnije dijeljenjem sa 10 ^ n. Provjerimo našu pomoćnu metodu:

javni statički double sMathRound (dvostruka vrijednost, int mjesta) {double scale = Math.pow (10, mjesta); return Math.round (vrijednost * ljestvica) / razmjera; }
assertThat (withMathRound (D, 2)). isEqualTo (4.24); assertThat (withMathRound (D, 3)). isEqualTo (4.235);

Međutim, ovaj se način preporučuje samo u određenim slučajevima, jer se ponekad izlaz može zaokružiti drugačije kao što se očekivalo prije ispisa.

Ovo je zbog Matematika # kolo je skraćivanje vrijednosti. Pogledajmo kako se to može dogoditi:

System.out.println (withMathRound (1000.0d, 17)); // daje: 92,23372036854776 !! System.out.println (withMathRound (260.775d, 2)); // Daje: 260,77 umjesto očekivanih 260,78 

Dakle, metoda je navedena samo u svrhe učenja.

4. Oblikovanje različitih vrsta brojeva

U nekim određenim slučajevima možda ćemo htjeti formatirati broj za određenu vrstu, poput valute, velikog cijelog broja ili postotka.

4.1. Oblikovanje velikih cijelih brojeva zarezima

Kad god u aplikaciji imamo veliki cijeli broj, možda ćemo ga htjeti prikazati zarezima pomoću DecimalFormat s unaprijed definiranim uzorkom:

javni statički niz withLargeIntegers (dvostruka vrijednost) {DecimalFormat df = new DecimalFormat ("###, ###, ###"); vrati df.format (vrijednost); } int vrijednost = 123456789; assertThat (withLargeIntegers (value)). isEqualTo ("123,456,789");

4.2. Dopunjavanje broja

U nekim ćemo slučajevima možda htjeti podmetnuti broj nulama za određenu duljinu. Ovdje možemo koristiti String # format metoda, kao što je ranije opisano:

javni statički String byPaddingZeros (int vrijednost, int paddingLength) {return String.format ("% 0" + paddingLength + "d", vrijednost); } int vrijednost = 1; assertThat (byPaddingOutZeros (vrijednost, 3)). isEqualTo ("001");

4.3. Oblikovanje brojeva s dvije nule nakon decimale

Da bismo mogli ispisati bilo koji zadani broj s dvije nule nakon decimalne točke, upotrijebit ćemo još jedanput DecimalFormat razred s unaprijed definiranim uzorkom:

javni statički double sTwoDecimalPlaces (dvostruka vrijednost) {DecimalFormat df = novi DecimalFormat ("#. 00"); vrati novi Double (df.format (value)); } int vrijednost = 12; assertThat (withTwoDecimalPlaces (value)). isEqualTo (12.00);

U ovom slučaju, stvorili smo novi format s uzorkom koji navodi dvije nule nakon decimalne točke.

4.4. Oblikovanje i postoci

S vremena na vrijeme možda ćemo trebati prikazati postotke.

U ovom slučaju možemo koristiti NumberFormat #getPercentInstance metoda. Ova metoda omogućuje nam da pružimo a Lokalno za ispis vrijednosti u formatu koji je točan za zemlju koju ste naveli:

javni statički niz forPercentages (dvostruka vrijednost, lokalizacija) {NumberFormat nf = NumberFormat.getPercentInstance (lokalizacija); return nf.format (vrijednost); } dvostruka vrijednost = 25f / 100f; assertThat (forPercentages (value, new Locale ("en", "US"))). isEqualTo ("25%");

4.5. Oblikovanje broja valute

Uobičajeni način za pohranu valuta u našoj aplikaciji je upotreba BigDecimal. Što ako ih želimo prikazati korisniku? U ovom slučaju možemo koristiti Format broja razred:

javni statički niz currencyWithChosenLocalisation (dvostruka vrijednost, lokalizacija) {NumberFormat nf = NumberFormat.getCurrencyInstance (lokalizacija); return nf.format (vrijednost); }

Primamo valutu za određenu Lokalno a zatim jednostavno nazovite format metoda s vrijednošću. Rezultat je broj prikazan kao valuta za navedenu zemlju:

dvostruka vrijednost = 23_500; assertThat (currencyWithChosenLocalisation (value, new Locale ("en", "US")). isEqualTo ("23.500,00 USD"); assertThat (currencyWithChosenLocalisation (value, new Locale ("zh", "CN"))). isEqualTo ("23.500,00" "); assertThat (currencyWithChosenLocalisation (value, new Locale ("pl", "PL")). isEqualTo ("23 500 zł");

5. Slučajevi naprednog formatiranja

DecimalFormat je jedan od najpopularnijih načina formatiranja decimalnog broja na Javi. Slično prethodnim primjerima, i mi ćemo napisati pomoćnu metodu:

javni statički double sDecimalFormatLocal (dvostruka vrijednost) {DecimalFormat df = (DecimalFormat) NumberFormat.getNumberInstance (Locale.getDefault ()); vrati novi Double (df.format (value)); }

Naša vrsta oblikovanja dobit će zadanu postavku za zadanu lokalizaciju.

Decimalno formatiranje različito se obrađuje u različitim zemljama koristeći njihove numeričke sustave. Na primjer, znak grupiranja (zarez u SAD-u, ali razmak ili točka na drugim lokalitetima), veličina grupiranja (tri u SAD-u i većina jezika, ali različita u Indiji) ili decimalni znak (točka u SAD-u, ali zarez na drugim lokalitetima).

dvostruki D = 4,2352989244d; assertThat (withDecimalFormatLocal (D)). isEqualTo (4.235);

Ovu funkcionalnost također možemo proširiti kako bismo pružili neke određene obrasce:

javni statički double sDecimalFormatPattern (dvostruka vrijednost, int mjesta) {DecimalFormat df2 = novi DecimalFormat ("#, ###, ###, ## 0.00"); DecimalFormat df3 = novi DecimalFormat ("#, ###, ###, ## 0.000"); if (places == 2) return new Double (df2.format (value)); inače if (places == 3) return new Double (df3.format (value)); inače baci novi IllegalArgumentException (); } assertThat (withDecimalFormatPattern (D, 2)). isEqualTo (4.24); assertThat (withDecimalFormatPattern (D, 3)). isEqualTo (4.235);

Ovdje dopuštamo našem korisniku da konfigurira DecimalFormat odabranim uzorkom na temelju broja razmaka.

6. Zaključak

U ovom smo članku nakratko prošli kroz različite načine formatiranja brojeva u Javi. Kao što vidimo, ne postoji jedan najbolji način za to. Moglo bi se slijediti mnogo pristupa jer svaki od njih ima svoje osobine.

Kao i uvijek, kod za ove primjere dostupan je na GitHubu.