我想用Java中的德语区域设置格式化双精度类型的数字。但是,由于以下代码的输出为: 0.0,因此出现了一些错误
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);
}
}你知道哪里出了问题或遗漏了什么吗?
谢谢,阿提库斯
发布于 2010-07-14 23:32:01
您正在尝试使用一个模式进行解析,该模式需要一个逗号(就像在德语中一样),但是您给它指定了一个句号("0.459")。看起来DecimalFormat在看到一个不理解的字符时会停止解析。如果您将其更改为“0.459,459”,您将看到它被正确解析,然后输出“0459”。(我不确定System.out.println是否使用系统默认区域设置,在这种情况下,它可能会根据您的区域设置打印"0,459“。)
注意,在这段代码中,您根本没有尝试格式化数字--只是解析一个数字。如果你想格式化它,调用format。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方法来完成此操作。
https://stackoverflow.com/questions/3247726
复制相似问题