Frage

Gibt es eine Möglichkeit DecimalFormat (oder ein anderes Standard-Formatierungs) zu Format Zahlen wie folgt zu verwenden:

  

1.000.000 => 1,00 M

     

1.234.567 => 1.23m

     

1234567890 => 1234.57M

Dividieren Grundsätzlich eine Zahl von 1 Million, hält zwei Dezimalstellen und Slapping ein ‚M‘ am Ende. Ich habe darüber nachgedacht, eine neue Unterklasse von Number zu schaffen, aber es sieht schwieriger, als ich dachte.

Ich schreibe eine API, die ein Format Methode, die wie folgt aussieht:

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

Intern Ich bin Mapping-Einheit Objekte NumberFormatters. Die Implementierung ist so etwas wie folgt aus:

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

Beachten Sie, dass aus diesem Grunde, ich nicht der Kunde von 1 Million, teilen erwarten kann, und ich kann nicht einfach verwenden String.format () ohne es in einem NumberFormatter gewickelt wird.

War es hilfreich?

Lösung

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

Weitere Informationen finden Sie in der String.format javadocs .

Andere Tipps

Beachten Sie, dass, wenn Sie einen BigDecimal haben, können Sie die movePointLeft Methode verwenden:

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

Hier ist eine Unterklasse von Number, die ich aufgepeitscht. Es sieht aus wie es die Arbeit erledigt, aber ich bin mir nicht ganz sicher, dass es der beste Weg:

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...");
    }
};

Warum nicht einfach?

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

Hier finden Sie aktuelle ChoiseFormat .

Eine simple Art und Weise wäre ein Wrapper zu verwenden, das Auto für Sie durch 1m geteilt.

Sie sollten nun ICU CompactDecimalFormat , die die Formatierung Ergebnis für nicht-Englisch Gegenden lokalisieren. Andere Gegenden möglicherweise keinen „Millionen“ Suffix verwenden.

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top