解析浮点数时字符串的 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 因此,您使用NumberFormat
将float
转换为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的主要内容,如果未能解决你的问题,请参考以下文章