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