使用DecimalFormat的问题

时间:2010-09-17 13:18:01

标签: java 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)  

如果有人对如何修复代码有任何过激,请告诉我。我想要系数上的两位小数。

谢谢

拉​​斯

6 个答案:

答案 0 :(得分:14)

使用:

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

答案 1 :(得分:2)

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

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

  

获取a的NumberFormat   特定区域设置,包括默认值   locale,调用NumberFormat之一   工厂方法,如   的getInstance()。一般来说,不要打电话   DecimalFormat构造函数   直接,自NumberFormat   工厂方法可能会返回子类   除了DecimalFormat之外。如果你需要   要自定义格式对象,请执行   像这样的东西:

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

您可能想要使用applyPattern方法:

  

applyPattern

     

public void applyPattern(String   pattern)将给定的模式应用于   这个Format对象。模式是一个   简短的规范   各种格式化属性。这些   属性也可以改变   单独通过各种   二传手术方法。没有限制   整数位由此设置   例程,因为那是典型的   最终用户的愿望;使用setMaximumInteger   如果你想设置一个真正的价值。对于   负数,使用秒   模式,用分号分隔

     

示例“#,#00.0#” - > 1,234.56

     

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

     

示例:“#,#00.0#;(#,#00.0#)”for   括号中的否定。

     

在负面模式中,最小值和   最大计数被忽略;这些是   被认为是积极的   图案。

     

抛出:NullPointerException - 如果   pattern为null   IllegalArgumentException - 如果是   给定的模式无效。

答案 2 :(得分:2)

您遇到了i18n问题。 DecimalFormat正在使用您的默认语言环境,它将小数分隔符指定为<​​kbd>,。但是,Double.valueOf不使用区域设置。它总是希望小数分隔符是

如果要解析使用DecimalFormat格式化的字符串,则需要使用DecimalFormat.parse

答案 3 :(得分:1)

我认为你打算做的是:

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

答案 4 :(得分:0)

您是否尝试格式化数字?还是围绕它?如果你正在格式化它,那么你的“s”方法(不好的名字,IMO,顺便说一句,但它是私有的,所以这是你的电话)不应该返回java.lang.String而不是double吗?

答案 5 :(得分: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);
        }