我想用Java的德语语言环境格式化double类型的数字。但是,由于以下代码的输出是错误的: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);
}
}
您有什么想法是对的还是缺失的?
谢谢,
tic
最佳答案
您正在尝试使用期望逗号(如德语)的模式进行解析,但是给了它一个句点(“ 0.459”)。看起来DecimalFormat
看到无法理解的字符时就停止解析。如果将其更改为“ 0,459”,则会看到它正确解析,然后输出“ 0.459”。 (我不确定System.out.println
是否使用系统默认语言环境,在这种情况下,它可能会根据您的语言环境显示“ 0,459”。)
请注意,您根本没有尝试在此代码中格式化数字-仅分析数字。如果要格式化,请调用格式。 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
方法执行此操作。