質問

このように形式番号にはDecimalFormat(またはいくつかの他の標準フォーマッタ)を使用する方法はあります:

  

1,000,000 => 1.00M

     

1,234,567 => 1.23M

     

1234567890 => 1234.57M

基本的には、100万によっていくつかの数を割る小数点以下2桁を維持、および終了に「M」を叩き。私はのNumberFormatの新しいサブクラスを作成する方法について考えてきましたが、それは私が想像よりもトリッキーに見えます。

私はこのようになりますformatメソッドを持っているAPIを書いています:

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

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

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

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

役に立ちましたか?

解決

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

詳細については、<のhref = "http://java.sun.com/javase/6/docs/api/java/lang/String.html#format(java.lang.String,%20javaを参照してください。 lang.Object ...)」のrel = "noreferrer"> String.Formatのjavadocをするます。

他のヒント

あなたはBigDecimalを持っている場合、あなたはmovePointLeftメソッドを使用することができます:

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

ここに私が手早くの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...");
    }
};

なぜないだけで?

DecimalFormat df = new DecimalFormat("0.00M");
System.out.println(df.format(n / 1000000));
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top