2016-03-04 49 views
0

我是Java新手,目前正忙於一些學校工作。 我的程序正在用輸入文件讀取行。 如果我輸入文件具有類似如何從輸入文件中提取十進制數?

「奧維的畝,114.8 43801」

行我必須打破文字,雙,整成獨立的部分。 我的名字部分已完成,但卡在數字部分。

我該如何提取114.8,然後只是43801? 我一次只需要一個數字。 最後我需要將114.8分成43801.然後到下一行。

Scanner fileInput = new Scanner(inFile); 
fileInput.useDelimiter("\\D+"); 
double i=0; 
while (fileInput.hasNextDouble()){ 
i=fileInput.nextDouble(); // get int 
System.out.println(i); 
} 

我試過,但它打印出 114.0 8.0 43801.0

正如你所看到的,十進制數是不正確的,我只需要一個號碼在同一時間。

+0

你嘗試小寫'D'? (用於數字) - 如'fileInput.useDelimiter(「\\ d +」);' – ochi

+0

剛剛嘗試過,輸出爲空。謝謝你的迴應。 – Jying11

+0

如果您有小數點,請嘗試使用'fileInput.hasNextFloat()'和'nextFloat()'而不是double – ochi

回答

0

您應該使用正則表達式。 docs for Pattern

String raw="Orville's Acres, 114.8 43801"; 
Pattern p=Pattern.compile("\\d+.?[\\d]*"); 
Matcher m=p.matcher(raw); 
while(m.find()){ 
    System.out.println(m.group()); 
} 

輸出:

114.8 43801

0

你得到8作爲單獨的token的原因是因爲你把delimiter設置爲Vincent提到的'\ D +'。根據您指定的delimiter,您可以指定如何將一行字符串分隔成不同的tokens,其中令牌就像單件一樣。

沒有指定上面設置的分隔符,即使用默認分隔符,您將用空格分隔字符串,如' ', '\t', '\n'。 這意味着您可以通過調用scanner.getNext()來獲得這些令牌爲字符串值:

{Orville's}, {Acres,}, {114.8}, {43801}

如果您有輸入數據格式的知識,則可以使用Integer.parse(string)Double.parse(string)。這些將解釋字符串值中的數字並將其返回給您。但是,請注意,如果傳遞給這些方法的字符串參數不是parse()方法所期望的格式(例如:string = "One"string = myId123,其中包含的內容不是數字),那麼您將得到格式異常,並且程序將崩潰。

你說你已經完成了名字部分;我會假設你能夠得到以下line部分。假設你有輸入數據格式的知識,你知道一個double有一個「。」。在令牌中。因此,你可以嘗試以下代碼:

String line = "114.8 43801"; 
while (scanner.hasNext()) 
{ 
    String token = scanner.next(); 

    if (token.contains(".")) // return true if the string has "." in it 
    { 
     doubleToken = Double.parseDouble(token); 
     System.out.println(doubleToken); // prints "114.8" 
    } 
    else 
    { 
     intToken = Integer.parseInt(token); 
     System.out.println(intToken);  // prints "43801" 
    } 
} 
0

假設行的文件格式是保證:

String Double Integer 

,或者當名稱中有兩個詞:

String String Double Integer 

您可以將各條線分成三部分並從那裏解析。您目前似乎一直專注於將各個部件一次從掃描儀中取出,當您可以整個生產線使用時。

Scanner fileInput = new Scanner(inFile); 
String name = ""; 
double d = 0; 
int i = 0; 

while (fileInput.hasNextLine()) { 
    String line = fileInput.nextLine(); // get the entire line 
    String[] parts = line.split(" "); // split into its three parts 

    if (parts.length == 3) { 
     name = parts[0];     // the first part is the name 
     d = Double.valueOf(parts[1]);  // the second part is the double 
     i = Integer.valueOf(parts[2]);  // the third part is the integer 
    } else { 
     name = parts[0] + " " + parts[1]; // the name is the first two parts 
     d = Double.valueOf(parts[2]);  // the third part is the double 
     i = Integer.valueOf(parts[3]);  // the fourth part is the integer 
    } 
    System.out.println("Got name: " + name + ", double: " + d + ", int: " + i); 
} 

這是一個非常有限的例子,但基於示例輸入,它將工作。如果需要,它可以擴展到使用名稱有任意數目的詞的行。

0

最簡單的方法就可以去是: 1),使用「空間」作爲分隔符來把一行作爲使用的BufferedReader 2)分割字符串的字符串和它會返回String []數組 3)(每個元素在陣列) 3.1)打印(Double.parseDouble(元素))

0

你只能改變你的正則表達式來

\\d+.?[\\d]*

相關問題