Tallformatering i Java

1. Oversikt

I denne opplæringen vil vi se på forskjellige tilnærminger til tallformatering i Java og hvordan du implementerer dem.

2. Grunnleggende formatering av tall med Streng # format

De Streng # format metoden er veldig nyttig for formatering av tall. Metoden tar to argumenter. Det første argumentet beskriver mønsteret på hvor mange desimaler vi vil se, og det andre argumentet er den gitte verdien:

dobbel verdi = 4.2352989244d; assertThat (String.format ("%. 2f", verdi)). er EqualTo ("4.24"); assertThat (String.format ("%. 3f", verdi)). er EqualTo ("4.235");

3. Desimalformatering ved avrunding

I Java har vi det to primitive typer som representerer desimaltallflyte og desimal:

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

Antall desimaler kan variere avhengig av operasjonene som utføres. I de fleste tilfeller er vi bare interessert i de første desimalene. La oss ta en titt på noen måter å formatere en desimal ved å avrunde.

3.1. Ved hjelp av BigDecimal for nummerformatering

De BigDecimal klasse gir metoder for å avrunde til et spesifisert antall desimaler. La oss lage en hjelpemetode som vil returnere en dobbel, avrundet til ønsket antall steder:

offentlig statisk dobbel medBigDecimal (dobbel verdi, int steder) {BigDecimal bigDecimal = ny BigDecimal (verdi); bigDecimal = bigDecimal.setScale (steder, RoundingMode.HALF_UP); returner bigDecimal.doubleValue (); }

Vi starter med en ny forekomst av BigDecimal med vår opprinnelige desimalverdi. Deretter, ved å stille inn skalaen, gir vi antall desimaler vi vil ha og hvordan vi vil runde tallet vårt. Ved å bruke denne metoden kan vi enkelt formatere a dobbelt verdi:

dobbelt D = 4.2352989244d; assertThat (withBigDecimal (D, 2)). er EqualTo (4.24); assertThat (withBigDecimal (D, 3)). er EqualTo (4.235);

3.2. Ved hjelp av Matematikk # runde

Vi kan også dra nytte av de statiske metodene i Matte klasse å runde a dobbelt verdi til en spesifisert desimal. I dette tilfellet kan vi juster antall desimaler ved å multiplisere og senere dele med 10 ^ n. La oss sjekke vår hjelpermetode:

offentlig statisk dobbel medMathRound (dobbel verdi, int steder) {dobbel skala = Math.pow (10, steder); returner Math.round (verdi * skala) / skala; }
hevder at (medMathRound (D, 2)). er lik (4,24); hevder at (medMathRound (D, 3)). er likTil (4.235);

Imidlertid er denne måten bare anbefalt i spesielle tilfeller, da noen ganger kan utdataene avrundes annerledes som forventet før det ble skrevet ut.

Dette er fordi Matematikk # runde avkorter verdien. La oss se hvordan dette kan skje:

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

Og så er metoden bare oppført for læringsformål.

4. Formatering av forskjellige typer numre

I noen spesielle tilfeller vil vi kanskje formatere et tall for en bestemt type som valuta, stort heltall eller prosentandel.

4.1. Formatering av store helheter med komma

Når vi har et stort heltall i applikasjonen vår, kan det være lurt å vise det med komma, ved hjelp av Desimalformat med et forhåndsdefinert mønster:

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

4.2. Polstring av et tall

I noen tilfeller vil vi kanskje putte et tall med nuller for en spesifisert lengde. Her kan vi bruke Streng # format metode, som beskrevet tidligere:

public static String byPaddingZeros (int value, int paddingLength) {return String.format ("% 0" + paddingLength + "d", value); } int-verdi = 1; assertThat (byPaddingOutZeros (verdi, 3)). er EqualTo ("001");

4.3. Formatering av tall med to nuller etter desimal

For å kunne skrive ut et gitt tall med to nuller etter desimaltegnet, bruker vi en gang til Desimalformat klasse med et forhåndsdefinert mønster:

offentlig statisk dobbel medTwoDecimalPlaces (dobbel verdi) {DecimalFormat df = ny DecimalFormat ("#. 00"); returner ny Double (df.format (verdi)); } int-verdi = 12; assertThat (withTwoDecimalPlaces (verdi)). er EqualTo (12.00);

I dette tilfellet, Vi har laget et nytt format med et mønster som angir to nuller etter desimaltegnet.

4.4. Formatering og prosentandel

Innimellom kan det hende vi må vise prosentandeler.

I dette tilfellet kan vi bruke Nummerformat #getPercentInstance metode. Denne metoden lar oss gi en Lokal for å skrive ut verdien i et format som er riktig for landet du spesifiserte:

offentlig statisk streng forPercentages (dobbel verdi, locale sted) {NumberFormat nf = NumberFormat.getPercentInstance (locale); returner nf.format (verdi); } dobbel verdi = 25f / 100f; assertThat (forPercentages (value, new Locale ("en", "US"))). isEqualTo ("25%");

4.5. Formatering av valutanummer

En vanlig måte å lagre valuta på i vår applikasjon er å bruke BigDecimal. Hva om vi vil vise dem til brukeren? I dette tilfellet kan vi bruke NumberFormat klasse:

offentlig statisk strengvalutaWithChosenLocalisation (dobbel verdi, lokal språk) {NumberFormat nf = NumberFormat.getCurrencyInstance (locale); return nf.format (verdi); }

Vi får valutainstansen for en gitt Lokal og så bare ringe format metode med verdien. Resultatet er tallet som vises som valuta for det angitte landet:

dobbel verdi = 23_500; assertThat (currencyWithChosenLocalisation (value, new Locale ("en", "US")). isEqualTo ("$ 23,500.00"); assertThat (currencyWithChosenLocalisation (value, new Locale ("zh", "CN"))). isEqualTo ("¥ 23 500,00"); assertThat (currencyWithChosenLocalisation (verdi, ny lokalitet ("pl", "PL"))). er EqualTo ("23 500 zł");

5. Avanserte formateringsbrukstilfeller

Desimalformat er en av de mest populære måtene å formatere et desimaltall på Java. I likhet med tidligere eksempler skriver vi en hjelpemetode:

offentlig statisk dobbel medDecimalFormatLocal (dobbel verdi) {DecimalFormat df = (DecimalFormat) NumberFormat.getNumberInstance (Locale.getDefault ()); returner ny Double (df.format (verdi)); }

Vår formatering vil få standardinnstillingen for en gitt lokalisering.

Desimalformateringen håndteres forskjellig i forskjellige land ved hjelp av deres numeriske systemer. For eksempel grupperingstegnet (komma i USA, men mellomrom eller punktum i andre lokaliteter), grupperingsstørrelsen (tre i USA og de fleste lokaliteter, men forskjellige i India), eller desimaltegnet (punktum i USA, men en komma på andre språk).

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

Vi kan også utvide denne funksjonaliteten til å gi noen spesifikke mønstre:

offentlig statisk dobbel medDecimalFormatPattern (dobbel verdi, int steder) {DecimalFormat df2 = ny DecimalFormat ("#, ###, ###, ## 0.00"); DecimalFormat df3 = ny DecimalFormat ("#, ###, ###, ## 0.000"); hvis (plasser == 2) returnerer ny Dobbel (df2.format (verdi)); annet hvis (steder == 3) returnerer ny Dobbel (df3.format (verdi)); ellers kaste nye IllegalArgumentException (); } hevder at (medDecimalFormatPattern (D, 2)). erEqualTo (4.24); assertThat (withDecimalFormatPattern (D, 3)). erEqualTo (4.235);

Her lar vi brukeren vår konfigurere Desimalformat etter valgt mønster basert på antall mellomrom.

6. Konklusjon

I denne artikkelen gikk vi kort gjennom forskjellige måter for tallformatering i Java. Som vi kan se er det ingen beste måten å gjøre dette på. Mange tilnærminger kan følges da hver av dem har sine egne egenskaper.

Som alltid er koden for disse eksemplene tilgjengelig på GitHub.