Java: парсинг строки в двойной - PullRequest
       13

Java: парсинг строки в двойной

1 голос
/ 13 сентября 2009

Я читаю файл в массив и пытаюсь вынуть числа и поместить их как двойные в собственный массив. И, видимо, мое второе имя должно быть «Ошибка». Из того, что я могу сказать, код в порядке .... по крайней мере, у меня ничего не выскакивает. Вот оно во всей красе.

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)

Программирование не обязательно является моей сильной стороной, и мои глаза начинают кровоточить, глядя на экран. Любые мысли или советы с благодарностью. Приветствия

Ответы [ 5 ]

5 голосов
/ 13 сентября 2009

Если ваш файл разделен запятыми, то лучше использовать 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());
}
4 голосов
/ 13 сентября 2009

Может быть, вы можете попробовать использовать класс сканера?

Scanner sc = new Scanner(new File("vector10.txt"));
ArrayList<Double> lst = new ArrayList<Double>();
while (sc.hasNextDouble()) {
  lst.add(new Double(sc.nextDouble()));
}
3 голосов
/ 13 сентября 2009

Кажется, что ваш код не тот, который на самом деле выполняется, но в вашем коде вы строите большую строку из всех ваших чисел, разделенных символами новой строки. Но затем вы разделяете его (используя String.split) на запятые, и в этой строке нет запятых. Так Double.parseDouble получает все числа одновременно.

1 голос
/ 13 сентября 2009

Double.parseDouble() как и все parse* методы плохо реагируют на символы, которых они не ожидают, и которые - к сожалению - включают пробелы. Несколько пробелов в вашей строке могут испортить вам весь день.

Чтобы решить, сначала будет хорошей идеей также split для пробелов, так что что-то вроде newString.split("[,\\s]+") будет хорошо работать, разбивая и удаляя любую последовательность пробелов и / или запятых. Затем, когда вы попытаетесь разобрать, trim ваша строка - просто для безопасности - что-то вроде Double.parseDouble(doubles[i].trim()). Для дополнительной безопасности перед синтаксическим анализом проверьте, не является ли ваша обрезанная строка пустой строкой - возможно, что-то вроде if (doubles[i].trim().length() < 1) continue;.

Удачи.

1 голос
/ 13 сентября 2009

Ошибка говорит о том, что вы вызываете Long.parseLong (), а не Double.parseDouble (), как говорит код, который вы опубликовали. Возможно, вы забыли перекомпилировать?

В этом может быть вся проблема, но если вы не отправите System.out.println (строку) значения, которое вы собираетесь вызвать Double.parseDouble (строка), прямо перед тем, чтобы вы могли увидеть значение, на котором оно не выполняется. 1003 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...