15

我正在尝试使用 DecimalFormat 格式化价格,但这不适用于所有变体。

DecimalFormat df = new DecimalFormat("0.##")
df.format(7.8)
df.format(85.0)

印刷

7.80

85

但是“7.79999”被格式化为“7.8”,而不是“7.80”。我试过用这种方式做事

DecimalFormat df = new DecimalFormat("0.00")

强制两个 dp,但随后“85.0”被格式化为“85.00”而不是“85”!

有没有办法捕获所有变化,以便将价格打印为 #、## 或 #.##?例如:

5, 55, 5.55, 5.50, 500, 500.40

4

6 回答 6

22

这两种格式略有不同。“#.##”意味着它将打印最多两位小数的数字,而“#.00”意味着它将始终显示两位小数,如果小数位小于两位,它将用零替换它们。请参阅下面的示例和输出。

public static final DecimalFormat df1 = new DecimalFormat( "#.##" );
public static final DecimalFormat df2 = new DecimalFormat( "#.00" );

System.out.println(df1.format(7.80));
System.out.println(df1.format(85));
System.out.println(df1.format(85.786));

System.out.println(df2.format(7.80));
System.out.println(df2.format(85));
System.out.println(df2.format(85.786));

输出将是

7.8
85
85.79

7.80
85.00
85.79
于 2013-05-16T09:37:38.610 回答
13

这似乎不是一个单一的formatter. 我建议您使用"0.00"格式并替换".00"为空字符串。

public static String myFormat(double number) {
  DecimalFormat df = new DecimalFormat("0.00");
  return df.format(number).replaceAll("\\.00$", "");
}
于 2013-05-16T09:37:54.330 回答
4

我认为这是不可能的,至少对于 Java SE 格式化程序来说是不可能的。您需要制作自定义格式化程序。我会这样做

String res = df.format(number).replace(".00", "");
于 2013-05-16T09:32:05.480 回答
3

请改用 BigDecimal 数字类:

例如,如果 n 是 BigDecimal,那么您可以使用

String s = NumberFormat.getCurrencyInstance().format(n);

顺便说一句,在处理金钱时使用 BigDecimal 是最佳实践。

于 2013-05-16T09:29:54.510 回答
0

您可以尝试:

DecimalFormat df = new DecimalFormat("#.##",new DecimalFormatSymbols(Locale.US));
于 2020-12-16T17:12:35.060 回答
-2
System.out.println(new java.text.DecimalFormat("#.##").format(5.00));

这将打印 5

System.out.println(new java.text.DecimalFormat("#.00").format(500.401));

这将打印 500.40

于 2018-01-30T02:23:44.777 回答