Nummeropmaak in Java

1. Overzicht

In deze zelfstudie bekijken we verschillende benaderingen van nummeropmaak in Java en hoe u deze kunt implementeren.

2. Basisgetalopmaak met Tekenreeks # formaat

De Tekenreeks # formaat methode is erg handig voor het opmaken van getallen. De methode heeft twee argumenten. Het eerste argument beschrijft het patroon van hoeveel decimalen we willen zien, en het tweede argument is de gegeven waarde:

dubbele waarde = 4.2352989244d; assertThat (String.format ("%. 2f", waarde)). isEqualTo ("4.24"); assertThat (String.format ("%. 3f", waarde)). isEqualTo ("4.235");

3. Decimale opmaak door afronding

In Java hebben we twee primitieve typen die decimale getallen vertegenwoordigenvlotter en decimale:

double myDouble = 7.8723d; zweven myFloat = 7.8723f;

Het aantal decimalen kan verschillen, afhankelijk van de uitgevoerde bewerkingen. In de meeste gevallen zijn we alleen geïnteresseerd in de eerste paar decimalen. Laten we eens kijken naar enkele manieren om een ​​decimaal op te maken door af te ronden.

3.1. Gebruik makend van BigDecimal voor nummeropmaak

De BigDecimal class biedt methoden om af te ronden op een bepaald aantal decimalen. Laten we een hulpmethode maken die een dubbele retourneert, afgerond op een gewenst aantal plaatsen:

openbare statische dubbele withBigDecimal (dubbele waarde, int plaatsen) {BigDecimal bigDecimal = nieuwe BigDecimal (waarde); bigDecimal = bigDecimal.setScale (plaatsen, RoundingMode.HALF_UP); retourneer bigDecimal.doubleValue (); }

We beginnen met een nieuw exemplaar van BigDecimal met onze oorspronkelijke decimale waarde. Dan, door de schaal in te stellen, geven we het aantal decimalen dat we willen en hoe we ons getal willen afronden. Door deze methode te gebruiken, kunnen we eenvoudig een dubbele waarde:

dubbele D = 4.2352989244d; assertThat (withBigDecimal (D, 2)). isEqualTo (4.24); assertThat (withBigDecimal (D, 3)). isEqualTo (4.235);

3.2. Gebruik makend van Wiskunde # ronde

We kunnen ook profiteren van de statische methoden in het Wiskunde klasse om a af te ronden dubbele waarde naar een opgegeven decimaal. In dit geval kunnen we pas het aantal decimalen aan door te vermenigvuldigen en later te delen door 10 ^ n. Laten we onze helper-methode eens bekijken:

openbare statische dubbele withMathRound (dubbele waarde, int plaatsen) {dubbele schaal = Math.pow (10, plaatsen); retourneer Math.round (waarde * schaal) / schaal; }
assertThat (withMathRound (D, 2)). isEqualTo (4.24); assertThat (withMathRound (D, 3)). isEqualTo (4.235);

Deze manier wordt echter alleen in bepaalde gevallen aanbevolen, omdat de uitvoer soms anders kan worden afgerond dan verwacht voordat het werd afgedrukt.

Dit is zo omdat Wiskunde # ronde is de waarde aan het afkappen. Laten we eens kijken hoe dit kan gebeuren:

System.out.println (withMathRound (1000.0d, 17)); // Geeft: 92.23372036854776 !! System.out.println (withMathRound (260.775d, 2)); // Geeft: 260,77 in plaats van 260,78 verwacht 

En dus wordt de methode alleen vermeld voor leerdoeleinden.

4. Opmaak van verschillende soorten nummers

In sommige specifieke gevallen willen we misschien een getal opmaken voor een specifiek type, zoals valuta, groot geheel getal of percentage.

4.1. Grote gehele getallen opmaken met komma's

Elke keer dat we een groot geheel getal in onze applicatie hebben, willen we deze misschien met komma's weergeven door DecimalFormat met een voorgedefinieerd patroon:

openbare statische String withLargeIntegers (dubbele waarde) {DecimalFormat df = new DecimalFormat ("###, ###, ###"); retourneer df.format (waarde); } int waarde = 123456789; assertThat (withLargeIntegers (waarde)). isEqualTo ("123,456,789");

4.2. Een nummer opvullen

In sommige gevallen willen we een getal opvullen met nullen voor een opgegeven lengte. Hier kunnen we de Tekenreeks # formaat methode, zoals eerder beschreven:

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

4.3. Getallen opmaken met twee nullen achter de komma

Om een ​​bepaald getal met twee nullen achter de komma te kunnen afdrukken, gebruiken we nog een keer DecimalFormat klasse met een voorgedefinieerd patroon:

openbare statische dubbele metTwoDecimalPlaces (dubbele waarde) {DecimalFormat df = nieuwe DecimalFormat ("#. 00"); retourneer nieuwe Double (df.format (waarde)); } int waarde = 12; assertThat (withTwoDecimalPlaces (waarde)). isEqualTo (12.00);

In dit geval, we hebben een nieuw formaat gemaakt met een patroon dat twee nullen specificeert na de komma.

4.4. Opmaak en percentages

Van tijd tot tijd moeten we misschien percentages weergeven.

In dit geval kunnen we de Nummer formaat#getPercentInstance methode. Met deze methode kunnen we een Locale om de waarde af te drukken in een formaat dat correct is voor het land dat u heeft opgegeven:

openbare statische String forPercentages (dubbele waarde, locale locale) {NumberFormat nf = NumberFormat.getPercentInstance (locale); return nf.format (waarde); } dubbele waarde = 25f / 100f; assertThat (forPercentages (waarde, nieuwe locale ("en", "US"))). isEqualTo ("25%");

4.5. Opmaak van valutanummers

Een veelgebruikte manier om valuta's in onze applicatie op te slaan, is door de BigDecimal. Wat als we ze aan de gebruiker willen tonen? In dit geval kunnen we de Nummer formaat klasse:

openbare statische String currencyWithChosenLocalisation (dubbele waarde, locale locale) {NumberFormat nf = NumberFormat.getCurrencyInstance (locale); return nf.format (waarde); }

We krijgen de valuta-instantie voor een gegeven Locale en bel dan gewoon het formaat methode met de waarde. Het resultaat is het getal dat wordt weergegeven als valuta voor het opgegeven land:

dubbele waarde = 23_500; assertThat (currencyWithChosenLocalisation (waarde, nieuwe locale ("en", "US"))). isEqualTo ("$ 23.500,00"); assertThat (currencyWithChosenLocalisation (waarde, nieuwe locale ("zh", "CN"))). isEqualTo ("¥ 23.500.00"); assertThat (currencyWithChosenLocalisation (waarde, nieuwe locale ("pl", "PL"))). isEqualTo ("23 500 zł");

5. Gebruiksscenario's voor geavanceerde opmaak

DecimalFormat is een van de meest populaire manieren om een ​​decimaal getal in Java op te maken. Net als bij eerdere voorbeelden zullen we een hulpmethode schrijven:

openbare statische dubbele withDecimalFormatLocal (dubbele waarde) {DecimalFormat df = (DecimalFormat) NumberFormat.getNumberInstance (Locale.getDefault ()); retourneer nieuwe Double (df.format (waarde)); }

Ons type opmaak krijgt de standaardinstelling voor een bepaalde lokalisatie.

De decimale opmaak wordt in verschillende landen op verschillende manieren verwerkt met behulp van hun numerieke systemen. Bijvoorbeeld het groeperingsteken (komma in de VS, maar spatie of punt in andere landinstellingen), de groepsgrootte (drie in de VS en de meeste landinstellingen, maar verschillend in India) of het decimaalteken (punt in de VS, maar een komma in andere landinstellingen).

dubbele D = 4.2352989244d; assertThat (withDecimalFormatLocal (D)). isEqualTo (4.235);

We kunnen deze functionaliteit ook uitbreiden om enkele specifieke patronen te bieden:

openbare statische dubbele metDecimalFormatPattern (dubbele waarde, int plaatsen) {DecimalFormat df2 = nieuwe DecimalFormat ("#, ###, ###, ## 0.00"); DecimalFormat df3 = nieuw DecimalFormat ("#, ###, ###, ## 0.000"); if (places == 2) retourneer nieuwe Double (df2.format (value)); else if (places == 3) retourneer nieuwe Double (df3.format (value)); anders werpen nieuwe IllegalArgumentException (); } assertThat (withDecimalFormatPattern (D, 2)). isEqualTo (4.24); assertThat (withDecimalFormatPattern (D, 3)). isEqualTo (4.235);

Hier laten we onze gebruiker configureren DecimalFormat door gekozen patroon op basis van het aantal spaties.

6. Conclusie

In dit artikel hebben we kort verschillende manieren van nummeropmaak in Java besproken. Zoals we kunnen zien, is er niet één beste manier om dit te doen. Er kunnen vele benaderingen worden gevolgd, aangezien elk van hen zijn eigen kenmerken heeft.

Zoals altijd is de code voor deze voorbeelden beschikbaar op GitHub.