2009-09-13 90 views
1

我正在將文件讀入數組,並試圖取出數字並將它們作爲雙精度數組放入其自己的數組中。顯然我的中間名必須是「錯誤」。從我所能告訴的代碼是好的....至少沒有任何東西跳出來對我。這是它的榮耀。Java:將字符串解析爲雙精度值

import java.io.BufferedInputStream; 
import java.io.DataInputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.util.*; 
import java.lang.Object.*; 

public class ReadFromFile { 
    public static void main (String[] args){ 
     File file = new File("vector10.txt"); 
     FileInputStream fis = null; 
     BufferedInputStream bis = null; 
     DataInputStream dis = null; 
     StringBuffer sb = new StringBuffer(); 
     String string = new String(); 

     try{ 
      fis = new FileInputStream(file); 
      bis = new BufferedInputStream(fis); 
      dis = new DataInputStream(bis); 


      while((string=dis.readLine()) != null){ 
       sb.append(string+"\n"); 
      } 

      fis.close(); 
      bis.close(); 
      dis.close(); 

      System.out.println(sb); 
      String newString = sb.toString(); 
      System.out.println(newString); 
      String[] doubles = newString.split(","); 
      for (int i=0; i<doubles.length; i++){ 
       System.out.println(doubles[i]); 
      } 

      Double arrDouble[] = new Double[doubles.length]; 

      int idx = 0; 
      for(String s : doubles) { 
       arrDouble[idx++] = Double.parseDouble(s); 
      }   

     } catch (FileNotFoundException e){ 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

它不斷拋出一個錯誤

at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48) 
at java.lang.Long.parseLong(Long.java:412) 
at java.lang.Long.parseLong(Long.java:461) 
at ReadFromFile.main(ReadFromFile.java:51) 

編程不一定是我的強項,我的眼睛開始流血看着屏幕。 感謝您的任何想法或提示。 Cheers

回答

1

錯誤表示您調用Long.parseLong(),而不是Double.parseDouble(),因爲您發佈的代碼表示。也許你忘了重新編譯?

這可能是整個問題,但是如果沒有發送要調用Double.parseDouble(string)的值的System.out.println(字符串),那麼您可以看到它失敗的值。

4

也許你可以嘗試使用掃描儀類?

Scanner sc = new Scanner(new File("vector10.txt")); 
ArrayList<Double> lst = new ArrayList<Double>(); 
while (sc.hasNextDouble()) { 
    lst.add(new Double(sc.nextDouble())); 
} 
3

您的代碼似乎並不是實際運行的代碼,但在您的代碼中,您正在構建一個由換行符分隔的所有數字的大字符串。但是,你可以用逗號分割它(使用String.split),並且該字符串中沒有逗號。所以Double.parseDouble一次獲取所有數字。

5

如果你的文件是逗號分隔的那麼最好使用Scanner

String doubles = "1.25, 1.65, 1.47"; 

Scanner f = new Scanner(doubles); 
f.useLocale(Locale.US); //without this line the program wouldn't work 
         //on machines with different locales 
f.useDelimiter(",\\s*"); 

while (f.hasNextDouble()) { 
    System.out.println(f.nextDouble()); 
} 
1

Double.parseDouble()像所有parse*方法不能很好地反應,他們不希望字符,而且 - 遺憾的是 - 包括空格。你的字符串中的幾個空格可能會毀掉你的整個一天。

爲了解決這個問題,首先在split的空格上也是一個好主意,所以像newString.split("[,\\s]+")這樣的東西可以很好地工作,分割和刪除任何空白和/或逗號的序列。然後當你試圖解析時,trim你的字符串 - 只是爲了安全 - 像Double.parseDouble(doubles[i].trim())。爲了更加安全,請在解析之前檢查您的修剪的字符串是不是空字符串 - 可能類似if (doubles[i].trim().length() < 1) continue;

祝你好運。

+0

根據文檔,Double.parseDouble的行爲與Double.valueOf的行爲相同,只返回double而不是Double,Double.valueOf的文檔聲明:「s中的前導和後綴空白字符被忽略。通過String.trim()方法;也就是說,ASCII空間和控制字符都被刪除。「因此,這個建議似乎是多餘的。 – Jules 2013-07-01 09:17:19

+0

4年前,情況並非如此,所以我很高興在Java類庫中修復了這些問題:-) – Guss 2013-07-01 15:19:46