Java十进制格式解析问题

时间:2015-12-08 13:00:52

标签: java number-formatting

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**

有任何请帮助我理解为什么解析无法将FRENCH语言环境格式化字符串(1 201)转换为普通双值(1201.0)?

4 个答案:

答案 0 :(得分:5)

有两种空格。 “正常”空格字符(第32号 - 十六进制0x20)和非中断空格(NBSP)(第160号 - 十六进制0xA0)。

由于某种原因(我不知道为什么)法语区域设置希望数字之间的空白字符是非破坏空间!您可以使用以下代码来自助:

String num = "1 201";
num = num.replaceAll(" ", "\u00A0");    // '\u00A0' is the non breaking whitespace character!

这样您的代码就会像预期的那样工作。请注意,如果您将double格式化为具有法语区域设置的String,则生成的空格字符也将是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'!

答案 1 :(得分:3)

实际上,Java正在使用字符牢不可破的空格(\u00a0)来解析法语数字。

因此,以下代码实际上有效:

String num = "1\u00a0201";
double dm = df.parse(num).doubleValue();
System.out.println("Number After parse: " + dm);

请参阅提供更多详细信息的@ParkerHalo答案。

答案 2 :(得分:2)

您可以使用

 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

答案 3 :(得分:1)

这似乎有效。

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();
}