1

我从 txt 文件中读取双精度值时遇到问题。我的程序只将整数转换为双精度数,但我想忽略它们。

示例文件:

1 2 3 4.5
5 6 7 8.1
9 10 11 12.7

这是我的代码:

File file = new File("file.txt");

    try{
        Scanner scanner = new Scanner(file);
        scanner.useLocale(Locale.US);
        while (scanner.hasNextLine()){
            if (scanner.hasNext() && scanner.hasNextDouble()){
                double value = scanner.nextDouble();
                System.out.println(value);
            }
        }
    }catch(FileNotFoundException e){}

我的输出是:

1.0
2.0
3.0
4.5
5.0
6.0
7.0
8.1
9.0
10.0
11.0
12.7
4

3 回答 3

7

好吧,整数可以表示为双精度数,因此Scanner当您要求它查找双精度数时会选择它们。您必须在扫描整数值后手动检查它们,或者使用Scanner.nextInt跳过整数输入并仅nextDouble在您(暂时)用完整数时使用。所以你的循环内的条件看起来像这样:

if (scanner.hasNext()) {
    if (scanner.hasNextInt()) {
        scanner.nextInt(); // Ignore this value since it's an Integer
    } else if (scanner.hasNextDouble()){
        double value = scanner.nextDouble();
        System.out.println(value);
    }
}

虽然老实说,我有点困惑为什么你将hasNextLine()其用作while循环的条件,因为这需要你单独检查hasNext(),就像你现在所做的那样。为什么不这样做呢?

while (scanner.hasNext()) { // Loop over all tokens in the Scanner.
    if (scanner.hasNextInt()) {
        scanner.nextInt(); // Ignore this value since it's an Integer
    } else if (scanner.hasNextDouble()){
        double value = scanner.nextDouble();
        System.out.println(value);
    }
}
于 2013-05-11T19:38:34.103 回答
2

那么检查它是否有一个整数作为下一个标记,带有.hasNextInt().

于 2013-05-11T19:37:44.707 回答
0

尝试这个...

if (scanner.hasNext()) {
        double value = scanner.nextDouble(); // Ignore this value since it's an Integer
        if (!value.toString().endsWith(".0"))
             System.out.println(value);
    }
}

如果您不使用标准数字,它将中断,但我不知道有任何地方不使用。您的错误的原因是 java 将 int 隐式转换为 double 。

于 2013-05-11T19:58:27.847 回答