带有 Locale.getDefault() 的数字格式没有给出预期的结果

Posted

技术标签:

【中文标题】带有 Locale.getDefault() 的数字格式没有给出预期的结果【英文标题】:Number format with Locale.getDefault() not giving expected result 【发布时间】:2012-09-10 11:28:31 【问题描述】:

我有这个代码:

public double stringToDouble(String s) 

       NumberFormat nf = NumberFormat.getInstance(Locale.getDefault());

    try 

        return nf.parse(s).doubleValue();
     catch (java.text.ParseException e) 
        return 0.0;
    

它工作正常,但对于某些值,例如 60.0,它给出 600.0,我不知道为什么,对于 60,它给出 60.0

有什么建议吗?提前致谢

【问题讨论】:

【参考方案1】:

好的,答案就是使用这个代码:

public double stringToDouble(String s) 

       NumberFormat nf = NumberFormat.getInstance(Locale.getDefault());
    nf.setGroupingUsed(false);
    ParsePosition parsePosition = new ParsePosition(0);
    Number n = nf.parse(s, parsePosition);
    if (n == null || parsePosition.getErrorIndex() >= 0 || parsePosition.getIndex() < s.length())
    
      /* not a valid number */
    
    return n.doubleValue();

用这个代替 Double.parseDouble();

【讨论】:

【参考方案2】:

发生这种情况是因为您的机器 (JVM) 上的默认语言环境将点解释为分组字符(3 位数分组,如 1.000.000,00),并且小数分隔符很可能是逗号字符。

我在我的机器上使用默认的英国语言环境运行您的代码 对于

System.out.println(stringToDouble("60.0")); System.out.println(stringToDouble("60")); System.out.println(stringToDouble("60,0"));

它打印: 60.060.0600.0

为了可移植性,不要设置默认而是特定的语言环境。

【讨论】:

以上是关于带有 Locale.getDefault() 的数字格式没有给出预期的结果的主要内容,如果未能解决你的问题,请参考以下文章

Locale

springboot~国际化Locale正确的姿势

如何让Locale.setDefault()在我的JavaFX应用程序中工作

在Textview中显示千位分隔符和十进制格式的数字

java 数字转为千分符格式字符串,将千分符格式字符串反转为数字

为啥有些浮点数出现尾随 0