2009-11-14 61 views
5

在Java here上有一个很好的舍入小数的问题。但我不知道我怎么能包括尾随零在我的计划一样,显示的价格:$ 1.50,$ 1.00包装如何正确显示价格最多两位小数(美分),包括Java中的尾随零?

String.format("%.2g%n", 0.912385); 

作品就好了简单的解决方案,但省略尾随零,如果它是在最后一个小数位。该问题,即使我只用表情像这样我的日程上来:

double price = 1.50; 

当我做不同的价格(加,乘等)的结果主要是显示这样计算:

$2.5000000000000003 

因此,使用的String.format为此,工作正常,但它截断上面的例子

$2.5 

是否有在小数点后第二位,显示尾随零有道什么地方呢?或两个零,如果计算的输出应该

$2.00 
+4

作为一个经验法则,绝对不要用浮点数来表示货币。请考虑使用美分/便士的整数。 – Pool 2009-11-14 14:07:58

回答

18

我会建议你这样做:

NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance(); 
double price = 2.50000000000003; 
System.out.println(currencyFormatter.format(price)); 

这样做的优点是特定于语言环境为好。例如,如果你在欧元区而不是美国,这将起作用。

+0

谢谢,我正在寻找那样的东西!我不知道getCurrencyInstance()方法。 – denchr 2009-11-14 14:11:34

11

大概可以用的String.format(...)完成的,但你可以使用DecimalFormat

double price = 2.50000000000003; 
DecimalFormat formatter = new DecimalFormat("$0.00"); 
System.out.println(formatter.format(price)); // print: $2.50 
4

您是否尝试过:

String s = String.format("$%.2f", 2.50); 

这将做到这一点。

+0

尽管我的回答完成了您的要求,但正如其他人所指出的那样,更好的解决方案是使用BigDecimal或真正的Money类。 – dustmachine 2011-09-08 14:30:40

14

虽然其他答案是完全有效的(特别是duffymo的答案),但是与格式化显示器相比,您有更大的问题。您实际上使用的是错误的类型的金额,这是一个离散值值。而不是double,你应该考虑使用java.lang.BigDecimal

(编辑:......还是很好的落实Money类为duffymo在评论中指出,从JScience的monetary模块或更近Joda-Money示例类 - 这还有待公布为正式版。)

+0

+1 - 优点。 BigDecimal或适当的Money类。 – duffymo 2009-11-14 14:31:10

+0

感谢您的建议。采取点:) – denchr 2009-11-14 14:40:48

0
public static String getFormattedData(String actualString) 
    { 
     String subString = "0.0"; 

     if(actualString.contains(".")) 
     { 
      subString = actualString.substring(actualString.indexOf("."), actualString.trim().length()); 

      if(Double.parseDouble(subString) > 0.0) 
       return actualString; 
      else 
       actualString = actualString.substring(0, actualString.indexOf(".")); 
     } 
     return actualString; 
    } 
相关问题