【问题标题】:Android NumberFormatException: Invalid Double - except the value is a valid DoubleAndroid NumberFormatException: Invalid Double - 除非该值是有效的 Double
【发布时间】:2014-03-05 23:11:59
【问题描述】:

所以前几天,Google Play 开发者控制台的崩溃部分弹出以下错误:

java.lang.NumberFormatException: Invalid double: "−0.05"

如果我错了,现在请纠正我,但这实际上是一个有效的替身 - 它在我的计算机、模拟器和我自己的 Android 设备 (Nexus 5) 上被识别为有效的替身

它崩溃的设备是运行 Android 4.3 的 Galaxy Note II - 请知道它为什么会崩溃吗?

【问题讨论】:

  • 显示代码。用户可能使用Locale 运行,, 作为小数点分隔符。使用明确的语言环境解析您的号码。
  • Locale 文档中有一个很好的部分叫做Be wary of the default locale

标签: java android parsing double numberformatexception


【解决方案1】:

取决于您的语言环境,它是或不是有效的替身。对于美国/英语语言环境,-0.05 是有效的双精度,但对于例如法语语言环境,它不是(它应该是带有逗号的 -0,05)。

您可以通过以下方式查看它的实际效果:

NumberFormat fmt = NumberFormat.getNumberInstance(Locale.US);
double d = fmt.parse("-0.05").doubleValue(); //-0.05

fmt = NumberFormat.getNumberInstance(Locale.FRENCH);
d = fmt.parse("-0.05").doubleValue(); //-0.0
d = fmt.parse("-0,05").doubleValue(); //-0.05

编辑

但是,您的问题可能并非如此。减号无效。您使用的是 而不是-(它们看起来相同,但字符不同)。演示:

Double.parseDouble("-0.05"); //ok
Double.parseDouble("−0.05"); //exception

【讨论】:

  • 我唯一的问题是我的应用程序用户中近 50% 的设备使用非英语区域设置 - 那么为什么这个问题在一段时间内只发生过一次,在数千台设备中几个月?
  • @BenEzard 你如何解析这个数字? Double.parseDouble?
  • 是的,就是那个方法——输入字符串总是用'.'格式化。 (保证是这种格式,因为它来自从我的服务器下载的文件)
  • 这不太可能是问题所在,因为它在其他数千台具有完全相同代码的设备上运行良好?
  • @BenEzard 如果您复制粘贴问题中的字符串并尝试解析它,您将收到错误消息。也许由于某种原因,字符串的生成方式不同?
【解决方案2】:

对于双常量,该语言要求您使用形式 -0.05d(带有“d”后缀)。看到这个reference

还要确保用作减号的符号是“连字符”而不是“长破折号”。

【讨论】:

  • 这不是强制性的 - 任何没有“f”或“d”后缀的浮点数都会被自动确定为双精度 - 实际上,在您的“浮点文字”部分下链接,他们写double d1 = 123.4;
  • 关于减号 - 如果它在所有其他设备上都可以正常工作,那么我认为它是正确的字符?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-26
  • 2013-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多