如何从输入文件中提取十进制数?

时间:2016-03-04 18:40:44

标签: java

我是Java的新手,目前我正忙于学校的一些工作。 我的程序正在读取带有行的输入文件。 如果我的输入文件有一行像

" Orville's Acres,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 43801.0

如您所见,十进制数字不正确,我一次只需要一个数字。

6 个答案:

答案 0 :(得分:2)

考虑输入" 114.8 43801",您可能希望使用空格作为分隔符。使用' \ D +'作为您的分隔符,您可以根据Java文档将字符串拆分为任何非数字: https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html

因此,你正在分裂为“114.8'

尝试使用默认的空白分隔符(不要设置一个..),它应该可以工作。

答案 1 :(得分: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

答案 2 :(得分:0)

你将8作为单独的token的原因是因为你将delimiter设置为'\ D +',正如Vincent所说。您可以将delimiter视为规则,将如何将一行字符串分隔为不同的tokens,其中令牌就像一个字符串。

如果没有指定上面设置的分隔符,即使用默认分隔符,您将使用' ', '\t', '\n'等空格分隔String。 这意味着您可以通过调用scanner.getNext()

将这些标记作为字符串值

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

如果您了解输入数据的格式,则可以使用Integer.parse(string) Double.parse(string)。这些将解释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"
    }
}

答案 3 :(得分: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);
}

这是一个非常有限的示例,但根据示例输入,它将起作用。它可以扩展为使用名称具有任意数量的单词的行。

答案 4 :(得分:0)

最简单的方法是: 1)使用BufferedReader将整行读取为String 2)使用'空格'分割字符串。作为分隔符,它将返回String []数组 3)for(数组中的每个元素)    3.1)print(Double.parseDouble(element))

答案 5 :(得分:0)

您只需将正则表达式更改为

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