【问题标题】:Java: Parsing a string to a doubleJava:将字符串解析为双精度
【发布时间】:2010-11-27 23:01:20
【问题描述】:

我正在将一个文件读入一个数组并尝试取出数字并将它们作为双精度数放入自己的数组中。显然我的中间名必须是“错误”。据我所知,代码没问题....至少没有什么对我跳出来的。这是它的所有荣耀。

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)

编程不一定是我的强项,看着屏幕我的眼睛开始流血。 任何想法或提示都将不胜感激。 干杯

【问题讨论】:

    标签: java arrays string file


    【解决方案1】:

    正如您发布的代码所说,该错误表明您正在调用 Long.parseLong(),而不是 Double.parseDouble()。也许你忘了重新编译?

    这可能是整个问题,但如果不发送值的 System.out.println(string),您将在之前调用 Double.parseDouble(string),这样您就可以看到它失败的值。

    【讨论】:

      【解决方案2】:

      也许您可以尝试使用 Scanner 类?

      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 一次得到所有的数字。

        【讨论】:

          【解决方案4】:

          如果您的文件以逗号分隔,那么最好使用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());
          }
          

          【讨论】:

            【解决方案5】:

            Double.parseDouble() 像所有parse* 方法一样,对他们不期望的字符反应不佳,而且 - 不幸的是 - 包括空格。字符串中的几个空格可能会毁了你一整天。

            要解决这个问题,首先在空格上使用split 也是一个好主意,所以像newString.split("[,\\s]+") 这样的东西可以通过拆分和删除任何空格和/或逗号序列来很好地工作。然后,当您尝试解析时,trim 您的字符串 - 只是为了安全 - 类似于 Double.parseDouble(doubles[i].trim())。为了更加安全,请在解析之前检查修剪后的字符串是否不是空字符串 - 可能类似于 if (doubles[i].trim().length() &lt; 1) continue;

            祝你好运。

            【讨论】:

            • 根据文档,Double.parseDouble 的行为与 Double.valueOf 相同,只是返回 double 而不是 Double,Double.valueOf 的文档指出:“忽略 s 中的前导和尾随空白字符。空格被删除,就像通过 String.trim() 方法一样;也就是说,ASCII 空格和控制字符都被删除了。"因此,这个建议似乎是多余的。
            • 4 年前不是这种情况,所以我很高兴 Java 类库中的问题已得到修复 :-)
            猜你喜欢
            • 2012-10-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多