14 Stimmen

Java: Format Zahl in Millionen

Gibt es eine Möglichkeit, DecimalFormat (oder eine andere Standardformatierung) zu verwenden, um Zahlen wie diese zu formatieren:

1,000,000 => 1.00M

1,234,567 => 1.23M

1,234,567,890 => 1234.57M

Im Grunde dividiert man eine Zahl durch 1 Million, behält 2 Dezimalstellen bei und hängt ein 'M' an das Ende. Ich habe darüber nachgedacht, eine neue Unterklasse von NumberFormat zu erstellen, aber es sieht schwieriger aus, als ich es mir vorgestellt habe.

Ich schreibe eine API, die eine Formatmethode hat, die wie folgt aussieht:

public String format(double value, Unit unit); // Unit is an enum

Intern bilde ich Unit-Objekte auf NumberFormatters ab. Die Implementierung sieht in etwa so aus:

public String format(double value, Unit unit)
{
    NumberFormatter formatter = formatters.get(unit);
    return formatter.format(value);
}

Beachten Sie, dass ich aus diesem Grund nicht erwarten kann, dass der Client durch 1 Million dividiert, und ich kann nicht einfach String.format() verwenden, ohne es in einen NumberFormatter zu verpacken.

0 Stimmen

Möchten Sie nur M(ega) oder auch (G)iga, (T)era usw. behandeln?

0 Stimmen

Es handelt sich dabei um das Volumen eines Wertpapiers, also M(illions) und möglicherweise B(illions), aber ich gebe mich mit dem M zufrieden.

0 Stimmen

Diese Frage betrifft hat in letzter Zeit viel Aufmerksamkeit erregt (aufgrund eines Kopfgeldes).

2voto

Evstropov V Punkte 382

In der Sprache Kotlin können Sie Erweiterungsfunktionen erstellen:

fun Long.formatToShortNumber(): String {
    return when {
        this >= 1000000000 -> String.format("%.2fB", this / 1000000000.0)
        this >= 1000000 -> String.format("%.2fM", this / 1000000.0)
        this >= 1000 -> String.format("%.2fK", this / 1000.0)
        else -> this.toString()
    }
}

0voto

sblundy Punkte 59298

Werfen Sie einen Blick auf WahlFormat .

Eine einfachere Möglichkeit wäre die Verwendung eines Wrappers, der automatisch durch 1m teilt.

0 Stimmen

Werfen Sie einen Blick ein die Dokumente, aber ich bin wirklich nicht sicher, wie das geht, um mir hier zu helfen. Scheint wie ChoiceFormat enthält im Grunde ein Bündel von Formaten und irgendwie passt die Eingabe mit einem dieser Sub-Formate. Ich denke, ich möchte, dass alle Eingaben die gleiche behandelt werden.

0voto

Heath Borders Punkte 29263

Im Moment sollten Sie die ICUs verwenden CompactDecimalFormat , die das Formatierungsergebnis für nicht-englische Sprachumgebungen lokalisiert. Andere Sprachumgebungen verwenden möglicherweise kein Suffix "Millions".

Diese Funktionalität wird Standard-Java in JDK 12 sein. con CompactNumberFormat .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X