Java:使用DecimalFormat格式化双精度和整数,但保留没有小数分隔符的整数。

17

我正在尝试在一个Java程序中格式化一些数字。这些数字既可以是双精度浮点型也可以是整数类型。在处理双精度浮点数时,我希望只保留两位小数;而在处理整数时,我希望程序不对其做任何修改。换句话说:

双精度浮点数 - 输入

14.0184849945

双打 - 输出

14.01

整数 - 输入

13

整数 - 输出

13 (not 13.00)

有没有一种方法可以在同一个 DecimalFormat 实例中实现这个?到目前为止,我的代码如下:

DecimalFormat df = new DecimalFormat("#,###,##0.00");
DecimalFormatSymbols otherSymbols = new   DecimalFormatSymbols(Locale.ENGLISH);
otherSymbols.setDecimalSeparator('.');
otherSymbols.setGroupingSeparator(',');
df.setDecimalFormatSymbols(otherSymbols);

4
为什么必须使用相同的“DecimalFormat”实例?使用两个“DecimalFormat”实例有什么问题,一个保留小数点后两位,另一个没有任何小数点后位数? - rgettman
因为程序每次格式化的数字都是双精度浮点数或整数,而在格式化之前无法确定其类型。因此,我希望有一个相同的实例,可以“理解”一个数字是双精度浮点数——以修剪多余的小数位——还是整数——以保持其不变。 - Lefteris008
2个回答

29
你可以将minimumFractionDigits设置为0,就像这样:
public class Test {

    public static void main(String[] args) {
        System.out.println(format(14.0184849945)); // prints '14.01'
        System.out.println(format(13)); // prints '13'
        System.out.println(format(3.5)); // prints '3.5'
        System.out.println(format(3.138136)); // prints '3.13'
    }

    public static String format(Number n) {
        NumberFormat format = DecimalFormat.getInstance();
        format.setRoundingMode(RoundingMode.FLOOR);
        format.setMinimumFractionDigits(0);
        format.setMaximumFractionDigits(2);
        return format.format(n);
    }

}

2
现在它将44.0格式化为44,将55.60格式化为55.6。 如何使用格式保留末尾的零? - user1510006

4

你能否将这个功能封装成一个实用程序调用。例如:

public class MyFormatter {

  private static DecimalFormat df;
  static {
    df = new DecimalFormat("#,###,##0.00");
    DecimalFormatSymbols otherSymbols = new   DecimalFormatSymbols(Locale.ENGLISH);
    otherSymbols.setDecimalSeparator('.');
    otherSymbols.setGroupingSeparator(',');
    df.setDecimalFormatSymbols(otherSymbols);
  }

  public static <T extends Number> String format(T number) {
     if (Integer.isAssignableFrom(number.getClass())
       return number.toString();

     return df.format(number);
  }
}

你可以直接使用 MyFormatter.format(int) 等方式进行操作。

只是一个小提示:format 方法中的类型参数实际上没有任何作用。只需删除它并使用 Number 类型作为 number 参数即可。 - Lii

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接