解析浮点数时字符串的 NumberFormatException

Posted

技术标签:

【中文标题】解析浮点数时字符串的 NumberFormatException【英文标题】:NumberFormatException for String while parsing float 【发布时间】:2016-08-24 06:13:44 【问题描述】:

这个错误可能是由于我不同的系统语言环境造成的。我使用 DOT 作为小数分隔符。

我尝试在我的应用程序启动时设置默认语言环境,但我遇到了同样的异常。

Locale.setDefault(Locale.US);

堆栈跟踪:

 Caused by: java.lang.NumberFormatException: For input string: "6,2" at
 sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2043) at
 sun.misc.FloatingDecimal.parseFloat(FloatingDecimal.java:122)  at
 java.lang.Float.parseFloat(Float.java:451)

【问题讨论】:

i use DOT as decimal separator ....NumberFormatException: For input string: "6,2"。听起来有些不对劲。 我很确定美国也使用点 您需要设置为使用逗号而不是点的语言环境(例如德语)。但是,最好在 NumberFormatter 实例上设置它而不是设置默认语言环境(它将在应用程序范围内产生各种效果)。 美国使用点?该死的..我很确定他们使用了逗号。虽然德语仍然给了我同样的例外...... @KevinEsche 我的计算机设置为使用点作为分隔符,但我的应用程序总是使用逗号分隔符获取浮点输入(它是一个网站解析器)。 【参考方案1】:

您的代码似乎正在使用Float.parseFloat。这不使用任何语言环境设置。来自文档:

返回一个新的浮点数,初始化为由指定的String 表示的值,由Float 类的valueOf 方法执行。

valueOf有详细的语法,包括这个:

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

所以基本上,您的默认语言环境在这里是无关紧要的。如果你想解析“6,2”,你应该使用 NumberFormat 和使用逗号作为小数分隔符的语言环境。

【讨论】:

我得到:Cannot format given Object as a Number 这是我的方法:NumberFormat format = NumberFormat.getInstance(Locale.FRANCE); course.setCourseGrade(Float.parseFloat(format.format(courseGrade))); @pror21 因此,您使用NumberFormatfloat 转换为String,然后在没有语言环境的情况下将其解析回float?这里有什么让你觉得奇怪的地方吗? @pror21:你还没有解释你真正想要实现的目标。我已经解释了问题中的行为,但您上面的评论似乎与它的关系并不密切...... courseGrade 是一个字符串(包含“6,2”),我必须将其解析为具有正确语言环境的浮点数。 @pror21:是的,所以您应该使用NumberFormat 解析它,正如我在回答中所说的那样。您当前正在调用NumberFormat.format - 然后使用Float.parseFloat 重新解析结果,这也不起作用...我建议您对如何使用NumberFormat 解析字符串进行更多研究...【参考方案2】:

我最终使用的是下面的代码:

    DecimalFormatSymbols symbols = new DecimalFormatSymbols();
    symbols.setDecimalSeparator('.');
    DecimalFormat format = new DecimalFormat("0.#");
    format.setDecimalFormatSymbols(symbols);

    try 
       course.setCourseGrade(format.parse(courseGrade).floatValue());
     catch (ParseException e) 
       e.printStackTrace();
    

【讨论】:

非常感谢。从昨晚开始我就一直在做。你的代码对我有用。

以上是关于解析浮点数时字符串的 NumberFormatException的主要内容,如果未能解决你的问题,请参考以下文章

如何解析八进制字符串作为Rust中的浮点数?

Android - 如何正确地将字符串解析为浮点数(价格数字格式:整数、小数或两者兼有)

关于浮点数的json解析

将浮点数解析为具有x位小数的字符串

如何将“20,54”解析为 js 中的浮点数? [复制]

从 std::string 解析整数,但如果是浮点数则失败