Java 十进制格式解析问题
Java Decimal Format parsing issue
public class NumFormatTest
{
public static void main(String[] args) throws ParseException
{
String num = "1 201";
DecimalFormat df = (DecimalFormat) NumberFormat.getNumberInstance(Locale.FRANCE);
System.out.println("Number Before parse: "+num);
double dm = df.parse(num).doubleValue();
System.out.println("Number After parse: "+dm);
}
}
输出:
Number Before parse: 1 201
Number After parse: 1.0
预期输出:
Number Before parse: 1 201
Number After parse: **1201**
能否帮助我理解为什么 parse 无法将 FRENCH 区域设置格式的字符串 (1 201) 转换为正常的双精度值 (1201.0)?
您可以使用
String num = "1 201";
DecimalFormat df = (DecimalFormat) NumberFormat.getNumberInstance(Locale.FRANCE);
System.out.println("Number Before parse: "+num);
DecimalFormatSymbols symbols = df.getDecimalFormatSymbols();
symbols.setGroupingSeparator(' ');
df.setDecimalFormatSymbols(symbols);
double dm = df.parse(num).doubleValue();
System.out.println("Number After parse: "+dm);
预期输出:
Number Before parse: 1 201
Number After parse: 1201.0
有两种space。 “正常”space 字符(编号 32 - 十六进制 0x20)和不间断 space (NBSP)(编号 160 - 十六进制 0xA0)。
法语语言环境要求数字之间的白色 space 字符是不间断的 space!您可以使用这行代码帮助自己:
String num = "1 201";
num = num.replaceAll(" ", "\u00A0"); // '\u00A0' is the non breaking whitespace character!
这样您的代码将按预期工作。请注意,如果您将 double
格式化为具有法语语言环境的 String
,则生成的白色 space 字符也将成为 NBSP!!!
DecimalFormat df = (DecimalFormat) NumberFormat.getNumberInstance(Locale.FRENCH);
System.out.println(df.format(1201.1));
// This will print "1 202,1" But the space character will be '\u00A0'!
实际上,Java是使用牢不可破的字符space(\u00a0
)来解析法语数字。
因此,以下代码实际有效:
String num = "1\u00a0201";
double dm = df.parse(num).doubleValue();
System.out.println("Number After parse: " + dm);
查看提供更多详细信息的@ParkerHalo 回答。
这似乎有效。
public double parse(String decimalAsText) {
NumberFormat decimalFormat = NumberFormat.getNumberInstance(Locale.FRANCE);
decimalAsText = decimalAsText.replace(' ', '\u00a0');
ParsePosition pp = new ParsePosition(0);
Number n = decimalFormat.parse(decimalAsText, pp);
return n.doubleValue();
}
public class NumFormatTest
{
public static void main(String[] args) throws ParseException
{
String num = "1 201";
DecimalFormat df = (DecimalFormat) NumberFormat.getNumberInstance(Locale.FRANCE);
System.out.println("Number Before parse: "+num);
double dm = df.parse(num).doubleValue();
System.out.println("Number After parse: "+dm);
}
}
输出:
Number Before parse: 1 201
Number After parse: 1.0
预期输出:
Number Before parse: 1 201
Number After parse: **1201**
能否帮助我理解为什么 parse 无法将 FRENCH 区域设置格式的字符串 (1 201) 转换为正常的双精度值 (1201.0)?
您可以使用
String num = "1 201";
DecimalFormat df = (DecimalFormat) NumberFormat.getNumberInstance(Locale.FRANCE);
System.out.println("Number Before parse: "+num);
DecimalFormatSymbols symbols = df.getDecimalFormatSymbols();
symbols.setGroupingSeparator(' ');
df.setDecimalFormatSymbols(symbols);
double dm = df.parse(num).doubleValue();
System.out.println("Number After parse: "+dm);
预期输出:
Number Before parse: 1 201
Number After parse: 1201.0
有两种space。 “正常”space 字符(编号 32 - 十六进制 0x20)和不间断 space (NBSP)(编号 160 - 十六进制 0xA0)。
法语语言环境要求数字之间的白色 space 字符是不间断的 space!您可以使用这行代码帮助自己:
String num = "1 201";
num = num.replaceAll(" ", "\u00A0"); // '\u00A0' is the non breaking whitespace character!
这样您的代码将按预期工作。请注意,如果您将 double
格式化为具有法语语言环境的 String
,则生成的白色 space 字符也将成为 NBSP!!!
DecimalFormat df = (DecimalFormat) NumberFormat.getNumberInstance(Locale.FRENCH);
System.out.println(df.format(1201.1));
// This will print "1 202,1" But the space character will be '\u00A0'!
实际上,Java是使用牢不可破的字符space(\u00a0
)来解析法语数字。
因此,以下代码实际有效:
String num = "1\u00a0201";
double dm = df.parse(num).doubleValue();
System.out.println("Number After parse: " + dm);
查看提供更多详细信息的@ParkerHalo 回答。
这似乎有效。
public double parse(String decimalAsText) {
NumberFormat decimalFormat = NumberFormat.getNumberInstance(Locale.FRANCE);
decimalAsText = decimalAsText.replace(' ', '\u00a0');
ParsePosition pp = new ParsePosition(0);
Number n = decimalFormat.parse(decimalAsText, pp);
return n.doubleValue();
}