2010-09-17 67 views
3

我在使用DecimalFormat进行回归后打印输出系数时遇到问题。使用DecimalFormat的问题

以下是面临问题的部分代码;

DecimalFormat twoDForm = new DecimalFormat("0.00"); 
private double s(double d){ 
    return Double.valueOf(twoDForm.format(d)); 
} 

这里是eclipse中的错误信息;

Exception in thread "main" java.lang.NumberFormatException: For input string: "0,16" 
at sun.misc.FloatingDecimal.readJavaFormatString(Unknown Source) 
at java.lang.Double.valueOf(Unknown Source) 
at model.ARF2.s(ARF2.java:126) 
at model.ARF2.printBestModel(ARF2.java:114) 
at testing.testclass3.bestForecastingModel(testclass3.java:69) 
at testing.testclass3.main(testclass3.java:36) 

请让我知道,如果任何人有任何关于如何修复代码surgestions。我的系数需要两位小数。

谢谢

拉尔斯

+0

点是否正确?不应该是'DecimalFormat twoDForm = new DecimalFormat(“0,00”);'?我现在不记得了。 – 2010-09-17 13:21:53

+0

什么是方法's'的输入? – dogbane 2010-09-17 13:22:26

+0

代码是错误的,但正确的答案取决于你想要做什么。你想打印两位小数,截断其余部分(有效舍入)吗?或者当你想要使用一个特定的舍入方法时,如果有更多的数字比你有小数位打印? – Jeff 2010-09-17 13:33:46

回答

2

http://download.oracle.com/javase/1.4.2/docs/api/java/text/DecimalFormat.html

以下摘录似乎是你的问题的一部分:

要获得的NumberFormat的 特定区域,包括默认 区域设置,请拨打NumberFormat的 工厂方法之一,如 getInstance()。通常,不要直接调用 DecimalFormat构造函数 ,因为NumberFormat 工厂方法可能会返回DecimalFormat以外的子类 。如果您需要 自定义格式对象,做 这样的事情:

NumberFormat f = NumberFormat.getInstance(loc); 
if (f instanceof DecimalFormat) { 
    ((DecimalFormat) f).setDecimalSeparatorAlwaysShown(true); 
} 

您可能需要使用applyPattern方法:

applyPattern

公共无效applyPattern(字符串 pattern)将此给定模式应用于 此Format对象。一个模式是 各种格式属性的简短规范。这些 属性也可以单独通过各种 setter方法更改为 。 没有限制,这个 例程设置整数位,因为这是典型的 最终用户的愿望;如果要设置实际值,请使用setMaximumInteger 。对于 负数,可使用一第二 图案,由分号

实施例分离 “#,#00.0#” - > 1,234.56

这意味着最少2个整数的 数字,1个分位数,和一个 最多2个小数位数。

例如:“#,#00.0#;(#,#00.0#)”为 括号中的负数。

在负数模式中,最大值和最大值被忽略;这些都是 推测设置为正 模式。

抛出:NullPointerException - 如果 模式为空 IllegalArgumentException - 如果 给定模式无效。

0

你想要格式化数字吗?还是圆呢?如果你正在格式化它,不应该使用“s”方法(坏名字IMO,顺便说一句,但它是私人的,所以你的电话)返回java.lang.String而不是double

1

我想你究竟想要做的是:

private static String s(double d) { 
    return twoDForm.format(d); 
} 
2

你所遇到的国际化问题。 DecimalFormat正在使用您的默认语言环境,该语言环境指定小数点分隔符为,。但是,Double.valueOf不使用区域设置。它总是期望小数点分隔符是

如果你想与解析格式DecimalFormat一个字符串,那么你需要使用DecimalFormat.parse

13

使用:

DecimalFormat twoDForm = new DecimalFormat("#.##"); 
    DecimalFormatSymbols dfs = new DecimalFormatSymbols(); 
    dfs.setDecimalSeparator('.'); 
    twoDForm.setDecimalFormatSymbols(dfs); 
+0

谢谢,它的作品! – ozhan 2012-07-28 21:31:56

+0

这应该是被接受的答案。这是完美的!!谢谢。 – 2017-09-21 05:38:13

0

检查您的语言环境。

DecimalFormat twoDForm = new DecimalFormat("0.00"); 
    private double s(double d){ 

    String doubleString = displayNumberAmount(twoDForm.format(d)); 
     return Double.valueOf(doubleString); 
    } 

    public static String displayNumberAmount(String amount) { 

      NumberFormat numberFormat = NumberFormat.getNumberInstance(Locale.CANADA_FRENCH); 

      Number number = 0; 

      try { 
       number = numberFormat.parse(amount); 

      } catch (ParseException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

      return String.format(Locale.US, "%1$,.2f", number); 
     }