java.lang.NumberFormatException 和 SystemDecimalSeparator

Posted

技术标签:

【中文标题】java.lang.NumberFormatException 和 SystemDecimalSeparator【英文标题】:java.lang.NumberFormatException and SystemDecimalSeparator 【发布时间】:2014-12-08 19:10:16 【问题描述】:

出现这个错误

java.lang.NumberFormatException: For input string: "20,00"
    at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2043)
    at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
    at java.lang.Double.parseDouble(Double.java:538)
    at com.agitech.autofaces.el.FormatUtil.parseDouble(FormatUtil.java:122)
    at com.agitech.erp.converter.DoubleConverter.getAsObject(DoubleConverter.java:27)

看完decimal-separator-in-numberformat这个,我试试

public class FormatUtil 
    public static char ApplicationDecimalSeparator = ',';
    public static char SystemDecimalSeparator;
    static         
        DecimalFormatSymbols symbols= DecimalFormatSymbols.getInstance();
        SystemDecimalSeparator = symbols.getDecimalSeparator();     
        symbols.setDecimalSeparator(ApplicationDecimalSeparator);
    
    public final static Double parseDouble(String d)
        if (d==null)
            return 0.0;
        return Double.parseDouble( fixDecimalSeparator(d) );
    
    public final static String fixDecimalSeparator(String d)
        if (SystemDecimalSeparator==ApplicationDecimalSeparator)
            return d;
        return d.replaceAll( ""+SystemDecimalSeparator, ""+ApplicationDecimalSeparator);
    

最后 SystemDecimalSeparator 已经是“,”那么为什么会出现这个异常?

它可能期望 20.00 但如何获取和修复此分隔符?

确实我测试了它的期望“20.00”,而默认的 SystemDecimalSeparator 已经是','

【问题讨论】:

可能值得看看下面的帖子***.com/questions/4713166/… 请发布 NumberFormatException 的完整堆栈跟踪 【参考方案1】:

您正在调用Double.parseDouble,它总是使用点作为小数分隔符 - 它根本不使用默认语言环境。

Double.parseDouble 的行为与 Double.valueOf(String) 类似,其文档包括:

要解释浮点值的本地化字符串表示,请使用NumberFormat 的子类。

【讨论】:

@NassimMOUALEK:这是记录在案的行为——你为什么希望我错了?正如我所说,如果您想解析本地化表示,请使用NumberFormat... 鉴于有另一种方法可以做到这一点,非常感谢您【参考方案2】:

这应该可行:

NumberFormat f = NumberFormat.getInstance(); // Gets a NumberFormat with the default locale, you can specify a Locale as first parameter (like Locale.FRENCH)
double myNumber = f.parse("20,0").doubleValue(); // myNumber now contains 20

【讨论】:

以上是关于java.lang.NumberFormatException 和 SystemDecimalSeparator的主要内容,如果未能解决你的问题,请参考以下文章