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).

20voto

jjnguy Punkte 132790
String.format("%.2fM", theNumber/ 1000000.0);

Weitere Informationen finden Sie in der String.format javadocs .

0 Stimmen

Für den Fall der Fälle: Verwenden Sie stattdessen 1000000.0.

0 Stimmen

Kleiner Erbsenzähler, sieht so aus, als ob sein Code Longs oder Ints verwendet, so dass man auf die Fließkommaarithmetik verzichten kann:

0 Stimmen

Wenn ich die Fließkommamathematik weglasse, würde ich eine ganze Zahl ohne Nachkommastellen erhalten. Wir brauchen mindestens 2.

5voto

oxbow_lakes Punkte 131223

Beachten Sie, dass Sie, wenn Sie eine BigDecimal können Sie die movePointLeft Methode:

new DecimalFormat("#.00").format(value.movePointLeft(6));

5voto

Für jemanden, der eine bestimmte Zahl in eine für Menschen lesbare Form umwandeln möchte.

public static String getHumanReadablePriceFromNumber(long number){

    if(number >= 1000000000){
        return String.format("%.2fB", number/ 1000000000.0);
    }

    if(number >= 1000000){
        return String.format("%.2fM", number/ 1000000.0);
    }

    if(number >= 100000){
        return String.format("%.2fL", number/ 100000.0);
    }

    if(number >=1000){
        return String.format("%.2fK", number/ 1000.0);
    }
    return String.valueOf(number);

}

3voto

Outlaw Programmer Punkte 9767

Hier ist eine Unterklasse von NumberFormat, die ich ausgearbeitet habe. Es sieht so aus, als ob es die Aufgabe erfüllt, aber ich bin mir nicht ganz sicher, ob es der beste Weg ist:

private static final NumberFormat MILLIONS = new NumberFormat()
{
    private NumberFormat LOCAL_REAL = new DecimalFormat("#,##0.00M");

    public StringBuffer format(double number, StringBuffer toAppendTo, FieldPosition pos)
    {
        double millions = number / 1000000D;
        if(millions > 0.1) LOCAL_REAL.format(millions, toAppendTo, pos);

        return toAppendTo;
    }

    public StringBuffer format(long number, StringBuffer toAppendTo, FieldPosition pos)
    {
        return format((double) number, toAppendTo, pos);
    }

    public Number parse(String source, ParsePosition parsePosition)
    {
        throw new UnsupportedOperationException("Not implemented...");
    }
};

0 Stimmen

Mir gefällt die Lösung von Outlaw, zumal sie auch eine "menschenlesbare" Formatierung von k/M/G erzeugen kann, ohne dass der Nutzer dieser API Berechnungen anstellen muss. Er erhält immer die kürzest mögliche Zahl. 999999 999.99k 999.99M 999.99G 999.99T

3voto

toolkit Punkte 48653

Warum nicht einfach?

DecimalFormat df = new DecimalFormat("0.00M");
System.out.println(df.format(n / 1000000));

0 Stimmen

Die Aufteilung muss innerhalb des Formatierers gekapselt werden. Schätze, ich werde die Frage aktualisieren, um das Problem, das ich habe, deutlicher zu erklären.

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