13

有没有办法使用 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 中。

4

8 回答 8

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

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

于 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 回答
2

对于希望将给定数字转换为人类可读形式的人。

public static String getHumanReadablePriceFromNumber(long number){

    if(number >= 1000000000){
        return String.format("%.2fB", number/ 1000000000.0);
    }

    if(number >= 1000000){
        return String.format("%.2fM", number/ 1000000.0);
    }

    if(number >= 100000){
        return String.format("%.2fL", number/ 100000.0);
    }

    if(number >=1000){
        return String.format("%.2fK", number/ 1000.0);
    }
    return String.valueOf(number);

}
于 2019-08-30T06:50:51.383 回答
0

看看ChoiseFormat

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

于 2009-02-09T19:11:39.277 回答
0

现在,您应该使用 ICU's CompactDecimalFormat,它将本地化​​非英语语言环境的格式化结果。其他语言环境可能不使用“百万”后缀。

此功能将是 JDK 12 中的标准 Java,带有CompactNumberFormat.

于 2019-03-18T14:50:45.420 回答
0

在 Kotlin 语言中,您可以进行扩展功能:

fun Long.formatToShortNumber(): String {
    return when {
        this >= 1000000000 -> String.format("%.2fB", this / 1000000000.0)
        this >= 1000000 -> String.format("%.2fM", this / 1000000.0)
        this >= 1000 -> String.format("%.2fK", this / 1000.0)
        else -> this.toString()
    }
}
于 2020-11-04T23:00:35.683 回答