首页 > 解决方案 > 如果它们在同一行上,是否可以读取字符串和数字(​​来自 TXT 文件)

问题描述

我很难说出我的问题的标题。

在我给定的作业中,我需要编写一个程序来读取文本文件。

例如:(这是在文本文件中,数字是商品的价格。)

Cappuccino, 3.50

Espresso, 2.10

Mochaccino, 5.99

Irish Coffee, 7.99

Caffe Americano, 6.40

Latte, 1.99

这是我读取文本文件的代码:

public void readFile(){
        while(x.hasNext()){
            String item = x.next();
            Double price = x.nextDouble();

            System.out.printf("%s $%.2f \n", item, price);

        }//end of whileLoop
    }

    public void closeFile(){
        x.close();
    }

我的输出:

Cappuccino, $3.50
Espresso, $2.10
Mochaccino, $5.99
Exception in thread "main" java.util.InputMismatchException
        at java.base/java.util.Scanner.throwFor(Scanner.java:939)
        at java.base/java.util.Scanner.next(Scanner.java:1594)
        at java.base/java.util.Scanner.nextDouble(Scanner.java:2564)
        at ReadTextFile.readFile(MiniProject.java:22)
        at MiniProject.main(MiniProject.java:400)

该代码运行良好,并且预期直到它到达一个包含两个单词而不是单数单词的菜单项。在阅读价格之前,我如何更改我的代码以阅读这两个词?

这是我希望我的程序能够读取文件的视频 - https://youtu.be/gIMxwKc-pw8

标签: java

解决方案


Scanner课程将阅读“令牌”。当你调用 时nextDouble,它会读取一个标记而不关心它是一个双精度数还是一个字符串或诸如此类,然后会尝试将其转换为双精度数。如果这行得通,那就是你得到的。如果没有,你会得到一个InputMismatchException.

因此,您要在这里完成的Irish Coffee是单个令牌(或者可能更新您的代码以继续读取令牌并将它们连接起来,这听起来更复杂)。此外,那个逗号在你的字符串中,我打赌你不想要那个。

Scanner 通过使用分隔符分隔标记来工作。开箱即用,分隔符是“任意数量的空格”(因此,空格和换行符)。

听起来您需要在这里重新定义分隔符:它可以是被任意数量的空格包围的逗号,也可以是换行符:

scanner.useDelimiter("(\\s*,\\s*)|\r?\n");

会做的工作。中间的那个 gobbledygook 是一个正则表达式。这个内容如下: [a] 任意数量的空格,然后是逗号,然后是任意数量的空格,或者 [b] 换行符。


推荐阅读