2010-07-14 101 views
2

我想用Java中的德语语言环境来格式化double类型的数字。但是不顺心的事,因为下面的代码的输出为:0.0Java DecimalFormat问题

package main; 

import java.text.DecimalFormat; 
import java.text.NumberFormat; 
import java.text.ParseException; 
import java.util.Locale; 

public class Test { 

    private static String decimal2Format = "000.000"; 

    public static void main(String args[]){ 
     DecimalFormat format = (DecimalFormat)NumberFormat.getInstance(new Locale("de")); 
     double value = 0; 
     try { 
      format.applyPattern(decimal2Format); 
      value = format.parse("0.459").doubleValue(); 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 

     System.out.println(value); 
    } 

} 

你有任何想法有什么错误或丢失?

感谢, 阿迪克斯

回答

9

你试图使用将期待一个逗号(,因为它是德国)的模式来分析,但你给它一个时间段(“0.459”)。它看起来像DecimalFormat当它看到一个它不理解的字符时停止解析。如果将其更改为“0,459”,则会看到它正确解析,然后输出“0.459”。 (我不知道是否System.out.println使用系统默认的语言环境,在这种情况下威力打印“0459”根据您所在地区。)

请注意,你有没有试过格式数量在所有在此代码中 - 只有解析了的一个数字。如果你想格式化,请调用格式。 double本身没有关联的格式 - 它只是一个数字。这不像使用特定格式化程序进行分析会返回保留该格式的值。

这里的代码将执行双重价值的实际格式化

DecimalFormat format = (DecimalFormat)NumberFormat.getInstance(new Locale("de")); 
double value = 0.459; 
String formatted = format.format(value); 
System.out.println(formatted); // Prints "0,459" 

编辑:好的,所以它听起来就像你从一种格式转换到另一个(从美国到欧洲,为例)。这意味着你应该使用两个不同的DecimalFormat对象 - 你可以可以在不同的通话间切换语言环境,但这对我来说听起来有点严峻。

我相信解析和检测错误的一种方法是使用parse超载,它也需要ParsePosition。将位置设置为0以开始,然后检查它是否在字符串的末尾 - 如果不是,则意味着解析有效失败。我觉得奇怪的是,没有一种方法可以自动执行此操作并引发异常,但我看不到一个...

您可能还希望将解析器设置为生成BigDecimal而不是double ,如果你正在处理更具逻辑性的十进制数值。你可以用setParseBigDecimal方法来做到这一点。

+0

关于这个问题的两件事: 我的目标是解析,因为我得到的输入作为一个字符串,所以实际上我需要解析和然后格式化它。那么在这种情况下,我认为我应该使用解析和格式化方法,对吗? 解析的另一件事是我需要它解析有点不同。我在验证模块中使用它,所以当我得到一个“234.a23”字符串,然后我不希望验证后它是“234.0”,但我想要一个解析异常来表明出现了问题。你是否知道任何会以这种方式行事的班级,还是应该实施我自己的验证? – Atticus 2010-07-15 06:34:12

+0

@Atticus:我编辑了我的答案......希望这会有所帮助。 – 2010-07-15 06:52:35

+0

感谢您的回答!它有帮助。 – Atticus 2010-07-15 07:02:40