【问题标题】:Formatting numbers using DecimalFormat使用 DecimalFormat 格式化数字
【发布时间】:2013-05-16 09:23:25
【问题描述】:

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

【问题讨论】:

标签: java decimalformat


【解决方案1】:

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

【讨论】:

  • 是的,我知道谢谢,但我需要一些涵盖这两个功能的东西,以便 7.79999 打印 7.80 和 85.00 打印 85
  • 恐怕内置格式化程序是不可能的。您必须手动格式化生成的字符串。如果它们是 00s,也许通过删除最后一个字符
  • 糟糕,没有看到@EvgeniyDorofeev 的答案,这是你唯一的可能
【解决方案2】:

这似乎无法通过单个formatter 解决。我建议您使用"0.00" 格式并将".00" 替换为空字符串。

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

【讨论】:

  • 如果小数点分隔符是逗号(取自默认语言环境,否)怎么办?还能用吗?
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    改用 BigDecimal 数字类:

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

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

    顺便说一句,在处理金钱时最好使用 BigDecimal。

    【讨论】:

    • 谢谢,但这不会删除尾随的零,例如5.0 和 5.00
    • 好的,将字符串与这个正则表达式进行比较 [0-9]*[.]0+: if (s.matches("[0-9]*[.]0+")) then “在经期前后脱掉这些东西”。这还将处理 5 位甚至 3 位数字货币之类的问题(其中一些仍然存在)。
    【解决方案5】:

    你可以试试:

    DecimalFormat df = new DecimalFormat("#.##",new DecimalFormatSymbols(Locale.US));
    

    【讨论】:

    • 请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助、质量更好,并且更有可能吸引投票。
    【解决方案6】:
    System.out.println(new java.text.DecimalFormat("#.##").format(5.00));
    

    这将打印 5

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

    这将打印 500.40

    【讨论】:

      猜你喜欢
      • 2015-03-03
      • 1970-01-01
      • 2018-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多