Nummerformatering i Java

1. Oversigt

I denne vejledning ser vi på forskellige tilgange til nummerformatering i Java og hvordan de implementeres.

2. Grundlæggende formatering af tal med Streng # format

Det Streng # format metoden er meget nyttig til formatering af tal. Metoden tager to argumenter. Det første argument beskriver mønsteret for, hvor mange decimaler vi vil se, og det andet argument er den givne værdi:

dobbelt værdi = 4.2352989244d; assertThat (String.format ("%. 2f", værdi)). er EqualTo ("4.24"); assertThat (String.format ("%. 3f", værdi)). er EqualTo ("4.235");

3. Decimal formatering ved afrunding

I Java har vi det to primitive typer, der repræsenterer decimaltalflyde og decimal:

dobbelt myDouble = 7.8723d; flyde myFloat = 7.8723f;

Antallet af decimaler kan være forskelligt afhængigt af de operationer, der udføres. I de fleste tilfælde er vi kun interesseret i de første par decimaler. Lad os se på nogle måder at formatere en decimal ved at afrunde.

3.1. Ved brug af BigDecimal til nummerformatering

Det BigDecimal klasse giver metoder til afrunding til et specificeret antal decimaler. Lad os oprette en hjælpermetode, der returnerer en dobbelt, afrundet til et ønsket antal steder:

offentlig statisk dobbelt med BigDecimal (dobbelt værdi, int steder) {BigDecimal bigDecimal = ny BigDecimal (værdi); bigDecimal = bigDecimal.setScale (steder, RoundingMode.HALF_UP); returner bigDecimal.doubleValue (); }

Vi starter med en ny forekomst af BigDecimal med vores oprindelige decimalværdi. Derefter, ved at indstille skalaen, giver vi antallet af decimaler, vi ønsker, og hvordan vi vil afrunde vores antal. Brug af denne metode giver os mulighed for let at formatere en dobbelt værdi:

dobbelt D = 4.2352989244d; hævder, at (med BigDecimal (D, 2)). er lig med (4,24); assertThat (medBigDecimal (D, 3)). er EqualTo (4.235);

3.2. Ved brug af Matematik # runde

Vi kan også drage fordel af de statiske metoder i Matematik klasse til runde a dobbelt værdi til en specificeret decimal. I dette tilfælde kan vi juster antallet af decimaler ved at gange og senere dividere med 10 ^ n. Lad os kontrollere vores hjælpemetode:

offentlig statisk dobbelt medMathRound (dobbelt værdi, int steder) {dobbelt skala = Math.pow (10, steder); returner Math.round (værdi * skala) / skala; }
hævder, at (medMathRound (D, 2)). er lig med (4,24); hævder, at (medMathRound (D, 3)). er lig med (4.235);

Denne måde anbefales dog kun i bestemte tilfælde, da output undertiden måske afrundes forskelligt, som det var forventet, før det blev udskrevet.

Dette er fordi Matematik # runde trunkerer værdien. Lad os se, hvordan dette kan ske:

System.out.println (medMathRound (1000.0d, 17)); // Giver: 92.23372036854776 !! System.out.println (medMathRound (260.775d, 2)); // Giver: 260,77 i stedet for forventet 260,78 

Og så er metoden kun angivet til læringsformål.

4. Formatering af forskellige typer numre

I nogle særlige tilfælde vil vi muligvis formatere et tal til en bestemt type som valuta, stort heltal eller procentdel.

4.1. Formatering af store heltal med kommaer

Når vi har et stort heltal i vores applikation, vil vi muligvis vise det med kommaer ved hjælp af Decimalformat med et foruddefineret mønster:

offentlig statisk streng medLargeIntegers (dobbelt værdi) {DecimalFormat df = ny DecimalFormat ("###, ###, ###"); returner df.format (værdi); } int-værdi = 123456789; assertThat (withLargeIntegers (værdi)). isEqualTo ("123,456,789");

4.2. Polstring af et tal

I nogle tilfælde vil vi muligvis putte et tal med nuller i en bestemt længde. Her kan vi bruge Streng # format metode, som beskrevet tidligere:

offentlig statisk String byPaddingZeros (int værdi, int paddingLength) {return String.format ("% 0" + paddingLength + "d", værdi); } int-værdi = 1; assertThat (byPaddingOutZeros (værdi, 3)). er EqualTo ("001");

4.3. Formatering af tal med to nuller efter decimalet

For at kunne udskrive et givet tal med to nuller efter decimaltegnet bruger vi en gang til Decimalformat klasse med et foruddefineret mønster:

offentlig statisk dobbelt medTwoDecimalPlaces (dobbelt værdi) {DecimalFormat df = ny DecimalFormat ("#. 00"); returner nyt dobbelt (df.format (værdi)); } int-værdi = 12; assertThat (withTwoDecimalPlaces (værdi)). er EqualTo (12,00);

I dette tilfælde, Vi har oprettet et nyt format med et mønster, der angiver to nuller efter decimaltegnet.

4.4. Formatering og procenter

Fra tid til anden skal vi muligvis vise procenter.

I dette tilfælde kan vi bruge AntalFormat #getPercentInstance metode. Denne metode giver os mulighed for at levere en Lokal for at udskrive værdien i et format, der er korrekt for det land, du har angivet:

offentlig statisk streng forPercentages (dobbelt værdi, landestandard) {NumberFormat nf = NumberFormat.getPercentInstance (locale); returnere nf.format (værdi); } dobbelt værdi = 25f / 100f; assertThat (forPercentages (værdi, ny lokalitet ("da", "US"))). er EqualTo ("25%");

4.5. Formatering af valutanummer

En almindelig måde at gemme valuta på i vores applikation er at bruge BigDecimal. Hvad hvis vi vil vise dem for brugeren? I dette tilfælde kan vi bruge NumberFormat klasse:

offentlig statisk strengvalutaWithChosenLocalisation (dobbelt værdi, landestandard) {NumberFormat nf = NumberFormat.getCurrencyInstance (locale); returnere nf.format (værdi); }

Vi får valutainstansen for en given Lokal og derefter bare ringe til format metode med værdien. Resultatet er det antal, der vises som valuta for det angivne land:

dobbelt værdi = 23_500; assertThat (currencyWithChosenLocalisation (værdi, ny lokalitet ("da", "US"))). isEqualTo ("$ 23.500,00"); assertThat (currencyWithChosenLocalisation (værdi, ny lokalitet ("zh", "CN"))). er EqualTo ("¥ 23.500,00"); assertThat (currencyWithChosenLocalisation (værdi, ny landestandard ("pl", "PL"))). er EqualTo ("23 500 zł");

5. Avanceret formatering

Decimalformat er en af ​​de mest populære måder at formatere et decimaltal på Java. I lighed med tidligere eksempler skriver vi en hjælpemetode:

offentlig statisk dobbelt medDecimalFormatLocal (dobbelt værdi) {DecimalFormat df = (DecimalFormat) NumberFormat.getNumberInstance (Locale.getDefault ()); returner nyt dobbelt (df.format (værdi)); }

Vores formatering får standardindstillingen for en given lokalisering.

Desimalformateringen håndteres forskelligt i forskellige lande ved hjælp af deres numeriske systemer. For eksempel grupperingstegnet (komma i USA, men mellemrum eller prik i andre lokaliteter), grupperingsstørrelsen (tre i USA og de fleste lokaliteter, men forskellige i Indien) eller decimaltegnet (prik i USA, men en komma på andre steder).

dobbelt D = 4.2352989244d; assertThat (withDecimalFormatLocal (D)). er EqualTo (4.235);

Vi kan også udvide denne funktionalitet til at give nogle specifikke mønstre:

offentlig statisk dobbelt medDecimalFormatPattern (dobbelt værdi, int steder) {DecimalFormat df2 = ny DecimalFormat ("#, ###, ###, ## 0.00"); DecimalFormat df3 = ny DecimalFormat ("#, ###, ###, ## 0.000"); hvis (placerer == 2) returnerer ny Double (df2.format (værdi)); ellers hvis (placerer == 3) returnerer ny dobbelt (df3.format (værdi)); ellers smider nyt IllegalArgumentException (); } hævder, at (medDecimalFormatPattern (D, 2)). erEqualTo (4.24); assertThat (withDecimalFormatPattern (D, 3)). er EqualTo (4.235);

Her tillader vi vores bruger at konfigurere Decimalformat efter valgt mønster baseret på antallet af mellemrum.

6. Konklusion

I denne artikel gik vi kort igennem forskellige måder til nummerformatering i Java. Som vi kan se, er der ingen bedste måde at gøre dette på. Mange tilgange kan følges, da hver af dem har sine egne egenskaber.

Som altid er koden til disse eksempler tilgængelig på GitHub.


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