ジャワ:百万フォーマット番号
-
22-08-2019 - |
質問
このように形式番号には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));
より単純な方法は、自動があなたのために1メートルで割ったラッパーを使用することです。
今のところ、あなたはhref="http://icu-project.org/apiref/icu4j/com/ibm/icu/text/CompactDecimalFormat.html" rel="nofollow noreferrer"> CompactDecimalFormat