我问的原因是因为我在 android 应用程序和 java 程序中有 2 段完全相同的代码做同样的事情(收集潮汐数据):
String[] string4 = tide4.replaceAll("[LmH]", "").split(" ");
Time4 = string4[0];
String height4 = string4[1].replaceAll("\\s", "");
System.out.println("HEIGHT4 = " + "'" + height4 + "'" );
//Convert the Meters into feet for tide heights
double heightM4 = Double.parseDouble(height4); //FAILS ON THIS LINE IN **JAVA** NOT IN ANDROID
异常:java.lang.NumberFormatException: For input string: "6.24 "
但是在我的机器上运行的java程序中解析它时失败了?在Android中它运行良好。
我在测试时注意到一件事有所不同。当在我的机器上的 eclipse 中打印“height4”的值时,它输出如下所示:HEIGHT4 = '6.24 ' <--Notice the space!
在 Android 中,它输出:HEIGHT4 = '6.24'<--No Space?
除了它们运行的平台之外(据我所知),这两位代码之间没有什么不同。
造成这种情况的原因是什么?与不可删除的空白有关吗?
最佳答案
What could the cause of this be? Something to do with that un-removable whitespace?
我认为这一切都与那个神秘的角色有关。它显然不是数字或数字中有效的其他字符之一,这肯定会导致解析错误。
您需要做的是使用调试器或一些跟踪打印来找出神秘字符是什么。例如:
char last = height4.charAt(height4.length() - 1);
System.out.println("The last character codepoint is " + ((int) last));
然后将代码点转换为十六进制并在 Unicode 表 http://unicode.org 中查找。
完成此操作后,您就可以找出谜团从何而来和/或摆脱它的最佳方法是什么。
<小时/>建议:如果我愿意,我会专注于弄清楚角色来自哪里。事实上,你会得到奇怪的东西,这令人担忧,并表明可能出现其他问题。如果你只是想摆脱不好的东西,那么你可能会掩盖一个更大的问题;例如更难找到。
<小时/>更新 - 0x00A0
代码点是 LATIN-1 补充中的“不间断空格”(NBSP) 字符:
String.trim()
方法不会删除它。它仅删除 ASCII 控制代码;即0x0000
到0x0020
。在
Pattern
实现的正则表达式语言中,"\\s"
并不匹配所有 Unicode 空间变体。这个问题有解决方案:Java regular expression to match _all_ whitespace characters
NBSP 的存在并不像“随机字符”那样有问题,但它表明您正在从渲染文本(例如 HTML)中“抓取”输入,并且两个平台之间的渲染或抓取过程存在差异。虽然本身不必担心,但您需要牢记这一点。
关于java - 在Android中使用Java Double.parseDouble和相同的方法有区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27283084/