[英]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.