2011-11-25 261 views
1

我有一個字符串= 「1.515 53.11 612.1 95.1 0 0 0 0」 我特林通過這個代碼解析它:用分隔符分析字符串「;」 (JAVA)

public class SendThread implements Runnable { 
    public void run() 
    { 
     socket = null; 
     BufferedReader in; 


     while (true) 
     { 
      // Loop until connected to server 
      while (socket == null){ 
       try{ 
        socket = new Socket ("192.168.137.1", 808);   
       } 
       catch (Exception e) { 
        socket = null; 

        //Log.d("Connection:", "Trying to connect..."); 
       } 
       try { 
       Thread.sleep(30); 
       } catch (Exception e) {} 
      } 

      // Get from the server 
      try { 

       in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 

       Log.d("Connection: ", "connected"); 

       String line = null; 

       while ((line = in.readLine()) != null) { 

        Log.d("Socket:", line); 

        NumberFormat nf = new DecimalFormat ("990,0"); 
        String[] tokens = null; 
        String[] tempData = null; 
        String[] windData = null; 

        try { 
         tokens = line.split(";"); 
         tempData = tokens[0].trim().split(" "); 
         windData = tokens[1].trim().split(" "); 
        } catch (Exception error) 
        { 
         Log.d("Parsing error:", error+""); 
        } 



        for (int i = 0; i < currentTemp.length; i++) 
         currentTemp[i] = (Double) nf.parse(tempData[i]); 
        for (int i = 0; i < currentWind.length; i++) 
         currentWind[i] = (Double) nf.parse(windData[i]); 

        //Toast.makeText(getApplicationContext(), "Received data:", duration) 
        for (int i = 0; i < currentTemp.length; i++){ 
         Log.d("Converted data: currentTemp["+i+"] = ", currentTemp[i]+""); 
        } 
        for (int i = 0; i < currentWind.length; i++){ 
         Log.d("Converted data: currentWind["+i+"] = ", currentWind[i]+""); 
        } 
       } 
       socket = null; 
       Log.d("Connection: ", "lost."); 

      } 
      catch (Exception e) { 
        socket = null; 
        Log.d("Connection: ", "lost."); 
        Log.d("Connection:", e+""); 
      } 
     } 
    } 
} 

錯誤代碼:(但我不知道更好的方法來保持套接字連接:)

我總是得到「java.text.ParseException:Unparseable number」。如何解決它?

令牌,TempData的,windData都是String []

+3

您報告的錯誤未由您發佈的代碼生成。 – cherouvim

+0

你確定這就是你正在做的?我將代碼放在一起,沒有錯誤。此外,似乎你在試圖解析數字時遇到了這種例外情況,這不在你提供的代碼 –

+0

中,你應該發佈一個更大的代碼段,除了\\;問題,我們仍然在猜測 – soulcheck

回答

3

除了別人怎麼說,我敢打賭,當你做

windData = tokens[1].split(" "); 

windDate = {"","0","0","0","0"} 

,並嘗試分析的第一個元素爲Number 。 嘗試做:

try { 
    tokens = line.split(";"); 
    tempData = tokens[0].trim().split(" "); 
    windData = tokens[1].trim().split(" "); 
} catch (Exception error) 
{ 
    Log.d("Parsing error:", error+""); 
} 
+0

是的!非常感謝你,現在它的解析就像它應該 –

+0

無論如何這是一個猜測作爲馬克英格拉姆說,你可能想用\\ s而不是「」來分割令牌。 – soulcheck

0

嘗試使用在分割爲空白的\s;例如tempData = tokens[0].split("\s"); ...它代表一個空白字符。

+0

無效的轉義序列(有效的轉義序列是\ b \ t \ n \ f \ r \「\'\\) –

+1

Try \\ s。\必須在java字符串中轉義 – soulcheck

2

您不需要轉義分號。試試看:

try { 
    tokens = line.split(";"); 
    tempData = tokens[0].split(" "); 
    windData = tokens[1].split(" "); 
} catch (Exception error) 
{ 
    Log.d("Parsing error:", error+""); 
} 

我懷疑你的分析錯誤是因爲輸入字符串中95.1之後的空格。就像這樣,你的tempData數組將有5個值,最後一個是''。試圖將其解析爲一個數字會給你一個例外。

+0

我試過了之前插入\\ 沒有幫助... –

+0

我添加了更多的信息到我的答案,關於異常的原因 – Chris

1

嗯,你的代碼(發佈)不會產生這個異常。其次,"\\;"是多餘的,你可以寫";"

1

你可以使用,字符串標記爲那。

String s = "1.515 53.11 612.1 95.1 ; 0 0 0 0"; 

    StringTokenizer tokenizer = new StringTokenizer(s,";"); 

    while(tokenizer.hasMoreElements()){ 
     StringTokenizer numberTokenize = new StringTokenizer(tokenizer.nextToken()); 
     while(numberTokenize.hasMoreElements()) { 
      System.out.println(numberTokenize.nextElement()); 
     } 
    }