Java:格式数以百万计

有没有办法使用DecimalFormat(或其他一些标准格式化程序)来格式化这样的数字:

1,000,000 => 1.00M

1,234,567 => 1.23M

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万,我不能只使用String.format()而不将它包装在NumberFormatter中。

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

有关更多信息,请参阅String.format javadocs 。

请注意,如果您有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)); 

看看ChoiseFormat 。

更简单的方法是使用一个自动除以1米的包装器。