Zahlenformatierung in Java

1. Übersicht

In diesem Tutorial werden verschiedene Ansätze zur Formatierung von Zahlen in Java und deren Implementierung vorgestellt.

2. Grundlegende Zahlenformatierung mit String # -Format

Die String # -Formatmethode ist sehr nützlich zum Formatieren von Zahlen. Die Methode akzeptiert zwei Argumente. Das erste Argument beschreibt das Muster, wie viele Dezimalstellen wir sehen möchten, und das zweite Argument ist der angegebene Wert:

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

3. Dezimalformatierung durch Runden

In Java gibt es zwei primitive Typen, die Dezimalzahlen darstellen - float und decimal :

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

Die Anzahl der Dezimalstellen kann je nach den ausgeführten Operationen unterschiedlich sein. In den meisten Fällen interessieren uns nur die ersten paar Dezimalstellen. Schauen wir uns einige Möglichkeiten an, eine Dezimalstelle durch Runden zu formatieren.

3.1. Verwenden von BigDecimal zur Formatierung von Zahlen

Die BigDecimal- Klasse bietet Methoden zum Runden auf eine bestimmte Anzahl von Dezimalstellen. Erstellen wir eine Hilfsmethode, die ein auf eine gewünschte Anzahl von Stellen gerundetes Doppel zurückgibt:

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

Wir beginnen mit einer neuen Instanz von BigDecimal mit unserem ursprünglichen Dezimalwert. Dann durch die Skala einstellen, stellen wir die Anzahl der Dezimalstellen wir wollen und wie wollen wir unsere Zahl abzurunden . Mit dieser Methode können wir auf einfache Weise einen doppelten Wert formatieren :

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

3.2. Verwenden von Math # round

Wir können auch die statischen Methoden in der Math- Klasse nutzen, um einen doppelten Wert auf eine bestimmte Dezimalstelle zu runden . In diesem Fall können wir die Anzahl der Dezimalstellen anpassen, indem wir multiplizieren und später durch 10 ^ n dividieren . Lassen Sie uns unsere Hilfsmethode überprüfen:

public static double withMathRound(double value, int places) { double scale = Math.pow(10, places); return Math.round(value * scale) / scale; }
assertThat(withMathRound(D, 2)).isEqualTo(4.24); assertThat(withMathRound(D, 3)).isEqualTo(4.235);

Diese Methode wird jedoch nur in bestimmten Fällen empfohlen, da die Ausgabe manchmal anders gerundet sein kann, als es vor dem Druck erwartet wurde.

Dies liegt daran, dass Math # round den Wert abschneidet . Mal sehen, wie das passieren kann:

System.out.println(withMathRound(1000.0d, 17)); // Gives: 92.23372036854776 !! System.out.println(withMathRound(260.775d, 2)); // Gives: 260.77 instead of expected 260.78 

Daher wird die Methode nur zu Lernzwecken aufgeführt.

4. Formatieren verschiedener Arten von Zahlen

In bestimmten Fällen möchten wir möglicherweise eine Zahl für einen bestimmten Typ wie Währung, große Ganzzahl oder Prozentsatz formatieren.

4.1. Formatieren großer Ganzzahlen mit Kommas

Wenn unsere Anwendung eine große Ganzzahl enthält, möchten wir diese möglicherweise mit Kommas anzeigen, indem wir DecimalFormat mit einem vordefinierten Muster verwenden:

public static String withLargeIntegers(double value) { DecimalFormat df = new DecimalFormat("###,###,###"); return df.format(value); } int value = 123456789; assertThat(withLargeIntegers(value)).isEqualTo("123,456,789");

4.2. Eine Nummer auffüllen

In einigen Fällen möchten wir möglicherweise eine Zahl mit Nullen für eine bestimmte Länge auffüllen. Hier können wir die Formatmethode Format # verwenden , wie zuvor beschrieben:

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

4.3. Formatieren von Zahlen mit zwei Nullen nach der Dezimalstelle

Um eine bestimmte Zahl mit zwei Nullen nach dem Dezimalpunkt drucken zu können, verwenden wir eine weitere DecimalFormat- Klasse mit einem vordefinierten Muster:

public static double withTwoDecimalPlaces(double value) { DecimalFormat df = new DecimalFormat("#.00"); return new Double(df.format(value)); } int value = 12; assertThat(withTwoDecimalPlaces(value)).isEqualTo(12.00);

In diesem Fall haben wir ein neues Format mit einem Muster erstellt, das zwei Nullen nach dem Dezimalpunkt angibt .

4.4. Formatierung und Prozentsätze

Von Zeit zu Zeit müssen wir möglicherweise Prozentsätze anzeigen.

In diesem Fall können wir die NumberFormat # getPercentInstance- Methode verwenden. Mit dieser Methode können wir ein Gebietsschema bereitstellen , um den Wert in einem Format zu drucken, das für das von Ihnen angegebene Land korrekt ist:

public static String forPercentages(double value, Locale locale) { NumberFormat nf = NumberFormat.getPercentInstance(locale); return nf.format(value); } double value = 25f / 100f; assertThat(forPercentages(value, new Locale("en", "US"))).isEqualTo("25%");

4.5. Formatierung der Währungsnummer

Eine übliche Methode zum Speichern von Währungen in unserer Anwendung ist die Verwendung von BigDecimal . Was ist, wenn wir sie dem Benutzer anzeigen möchten? In diesem Fall können wir die NumberFormat- Klasse verwenden:

public static String currencyWithChosenLocalisation(double value, Locale locale) { NumberFormat nf = NumberFormat.getCurrencyInstance(locale); return nf.format(value); }

Wir erhalten die Währungsinstanz für ein bestimmtes Gebietsschema und rufen dann einfach die Formatmethode mit dem Wert auf. Das Ergebnis ist die Nummer, die als Währung für das angegebene Land angezeigt wird:

double value = 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(value, new Locale("pl", "PL"))).isEqualTo("23 500 zł");

5. Anwendungsfälle für die erweiterte Formatierung

DecimalFormat ist eine der beliebtesten Methoden zum Formatieren einer Dezimalzahl in Java. Ähnlich wie in den vorherigen Beispielen schreiben wir eine Hilfsmethode:

public static double withDecimalFormatLocal(double value) { DecimalFormat df = (DecimalFormat) NumberFormat.getNumberInstance(Locale.getDefault()); return new Double(df.format(value)); }

Unsere Formatierungsart erhält die Standardeinstellung für eine bestimmte Lokalisierung.

Die Dezimalformatierung wird in verschiedenen Ländern mithilfe ihrer numerischen Systeme unterschiedlich behandelt. Zum Beispiel das Gruppierungszeichen (Komma in den USA, aber Leerzeichen oder Punkt in anderen Gebietsschemas), die Gruppierungsgröße (drei in den USA und die meisten Gebietsschemas, aber unterschiedlich in Indien) oder das Dezimalzeichen (Punkt in den USA, aber a Komma an anderen Stellen).

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

Wir können diese Funktionalität auch erweitern, um einige spezifische Muster bereitzustellen:

public static double withDecimalFormatPattern(double value, int places) { DecimalFormat df2 = new DecimalFormat("#,###,###,##0.00"); DecimalFormat df3 = new 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(withDecimalFormatPattern(D, 2)).isEqualTo(4.24); assertThat(withDecimalFormatPattern(D, 3)).isEqualTo(4.235);

Hier erlauben wir unserem Benutzer, DecimalFormat anhand des ausgewählten Musters basierend auf der Anzahl der Leerzeichen zu konfigurieren .

6. Fazit

In diesem Artikel haben wir kurz verschiedene Arten der Zahlenformatierung in Java durchgearbeitet. Wie wir sehen können, gibt es keinen besten Weg, dies zu tun. Es können viele Ansätze verfolgt werden, da jeder von ihnen seine eigenen Merkmale aufweist.

Wie immer ist der Code für diese Beispiele auf GitHub verfügbar.