为什么scan.nextFloat()不能只读取浮点值?

时间:2017-02-26 22:24:46

标签: java java.util.scanner

我试图从包含整数和浮点值的文件中读取浮点值,但是当我执行scan.nextFloat()时,它仍会读取下一个整数值并将其转换为浮点值并将其添加到我的点列表中。以下是我正在做的事情。

while(scan.hasNextFloat()) {
     points.add(scan.nextFloat());
} 

文件中的示例点

3 4

3.3 4 5

2.3 3 3

有没有办法只读取文件中的浮点值,如3.3和2.3。另外不应该scan.nextFloat()在跳过int值时只读取浮点值吗?

2 个答案:

答案 0 :(得分:2)

你几乎必须接受nextFloat将读取3之类的数字为3.0。如果您不想要整数的数字,那么只需在您阅读完之后将其过滤掉即可。 (参见其他答案。)但如果你想包括" 3.0"但不是" 3"那么你将不得不以字符串形式读取值,只解析具有小数的值:

while (scan.hasNext()) {
   String s = scan.next();
   if (s.indexOf('.') != -1) {
       double d = Double.parseDouble(s);
       // do something with d...
   }
}

答案 1 :(得分:0)

根据docs hasNextFloat()方法:

  

如果使用nextFloat()方法将此扫描器输入中的下一个标记解释为浮点值,则返回true

nextFloat()表示(强调我的):

  

(...)   如果下一个标记与上面定义的 Float 正则表达式匹配,则标记将转换为浮点值,就像删除所有特定于语言环境的前缀,组分隔符和特定于语言环境的后缀一样,然后映射非ASCII数字通过Character.digit转换为ASCII数字,如果存在特定于区域设置的负前缀和后缀,则在前面添加一个负号( - ),并将结果字符串传递给Float.parseFloat。如果令牌与本地化的NaN或无穷大字符串匹配,则“Nan”或“Infinity”将根据需要传递给Float.parseFloat。

另一方面,

Float可以是Decimal,HexFloat或SignedNonNumber。 Decimal可以是DecimalNumeral,可以是数字,也就是数字。

这就是原因。

另一种只取浮点值的方法是这个(如果你的文件当然只包含整数和浮点数):

while(scan.hasNext() && !scan.hasNextInt()) {
 points.add(scan.nextFloat());

}