使用DecimalFormat格式化数字



我正在尝试使用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

这两种格式略有不同。"#.##"表示它将打印最多两位小数的数字,而"#.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

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

public static String myFormat(double number) {
  DecimalFormat df = new DecimalFormat("0.00");
  return df.format(number).replaceAll("\.00$", "");
}

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

String res = df.format(number).replace(".00", "");

使用BigDecimal数字类:

例如,如果n是BigDecimal,然后你可以使用

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

顺便说一句,在处理货币时使用BigDecimal是最好的做法。

您可以尝试使用:

DecimalFormat df = new DecimalFormat("#.##",new DecimalFormatSymbols(Locale.US));
System.out.println(new java.text.DecimalFormat("#.##").format(5.00));

这将打印5个

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

这将打印500.40

最新更新