[英]Is there a difference when using Java Double.parseDouble and the same method in Android?
我问的原因是因为我在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?
除了它们运行的平台(据我所知)之外,这两位代码之间没有什么不同。 这可能是什么原因? 与该不可移动的空白有关?
这可能是什么原因? 与该不可移动的空白有关?
我认为这与这个神秘角色有关。 显然不是数字或数字中有效的其他字符之一,这肯定会导致解析错误。
您需要做的是使用调试器或一些跟踪打印来找出神秘字符。 例如:
char last = height4.charAt(height4.length() - 1);
System.out.println("The last character codepoint is " + ((int) last));
然后将代码点转换为十六进制并在http://unicode.org的Unicode表中查找
完成此操作后,您可以弄清楚谜团的来历和/或消除谜团的最佳方法是什么。
忠告:如果我愿意,我将专注于弄清楚角色来自何处。 您正在获取奇怪的东西的事实令人担忧,并指出了其他问题的可能性。 如果您只是想摆脱不良的东西,那么您可能会在地毯下扫除更大的问题。 例如,使其更难找到。
更新 0x00A0
代码点是LATIN-1补充中的“不间断空格”(NBSP)字符:
String.trim()
方法不会删除它。 它仅删除ASCII控制代码; 即0x0000
到0x0020
。
在Pattern
实现的正则表达式语言中, "\\\\s"
与所有Unicode空间变体都不匹配。 这个问题有解决方案: Java正则表达式匹配_all_个空格字符
NBSP的存在不像“随机字符”那样麻烦,但是它表明您正在“渲染”来自渲染文本(例如HTML)的输入,并且两个平台之间的渲染或抓取过程有所不同。 虽然本身不必担心,但您需要牢记这一点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.