13

DecimalFormat (またはその他の標準フォーマッタ) を使用して数値を次のようにフォーマットする方法はありますか:

1,000,000 => 1.00M

1,234,567 => 123 万

1,234,567,890 => 1234.57M

基本的に、ある数値を 100 万で割り、小数点以下 2 桁を維持し、末尾に「M」を付けます。NumberFormat の新しいサブクラスを作成することを考えましたが、想像以上に難しそうです。

次のようなフォーマット メソッドを持つ API を作成しています。

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

内部的には、Unit オブジェクトを NumberFormatters にマッピングしています。実装は次のようなものです。

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

このため、クライアントが 100 万で割ることは期待できないことに注意してください。また、NumberFormatter でラップせずに String.format() を使用することはできません。

4

8 に答える 8

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

詳細については、String.formatjavadocsを参照してください。

于 2009-02-09T19:21:03.777 に答える
4

がある場合は、次のメソッドBigDecimalを使用できることに注意してください。movePointLeft

new DecimalFormat("#.00").format(value.movePointLeft(6));
于 2009-02-09T22:32:59.743 に答える
3

これが私が作成したNumberFormatのサブクラスです。それは仕事をしているように見えますが、それが最善の方法であるかどうかは完全にはわかりません。

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...");
    }
};
于 2009-02-09T19:18:31.257 に答える
3

なぜ単純ではないのですか?

DecimalFormat df = new DecimalFormat("0.00M");
System.out.println(df.format(n / 1000000));
于 2009-02-09T19:27:07.570 に答える
0

ChoiseFormatを見てください。

より単純な方法は、1m で自動分割されるラッパーを使用することです。

于 2009-02-09T19:11:39.277 に答える