Java 重新定义扫描仪';s不是一个数字识别?
在Java中,类Java 重新定义扫描仪';s不是一个数字识别?,java,double,java.util.scanner,nan,Java,Double,Java.util.scanner,Nan,在Java中,类Java.util.Scanner提供了一种解析长字符串的方便方法。在我的特殊情况下,我必须解析具有许多double值的字符串,为此我使用nextDouble()方法 有时,我的输入字符串包含nan,而不是有效的浮点数。不幸的是,Scanner似乎只能识别非数字的NaN 有没有办法教它也识别nan?可能通过使用DecimalFormatSymbols.setNaN()?设置自定义区域设置,一个选项是设置自定义区域设置。另一种选择是,扫描程序在内部使用正则表达式检索双字符串,然后使
Java.util.Scanner
提供了一种解析长字符串的方便方法。在我的特殊情况下,我必须解析具有许多double
值的字符串,为此我使用nextDouble()
方法
有时,我的输入字符串包含nan
,而不是有效的浮点数。不幸的是,Scanner
似乎只能识别非数字的NaN
有没有办法教它也识别nan?可能通过使用
DecimalFormatSymbols.setNaN()
?设置自定义区域设置
,一个选项是设置自定义区域设置
。另一种选择是,扫描程序在内部使用正则表达式检索双字符串,然后使用double.parseDouble
将其转换为double
,因此您可以使用正则表达式调用scanner#next(模式)
,除了使用“nan”而不是“nan”然后对返回的字符串调用Double.parseDouble
。类似的方法如何
private static final Pattern nan =
Pattern.compile("nan", Pattern.CASE_INSENSITIVE);
public static boolean hasNextDouble(Scanner scanner) {
if(scanner == null)
return false;
return scanner.hasNext(nan) || scanner.hasNextDouble();
}
public static double nextDouble(Scanner scanner) {
if(scanner.hasNext(nan)) {
scanner.next();
return Double.NaN;
}
return scanner.nextDouble();
}
你为什么不直接用字符串替换输入中的所有内容,搜索nan并将它们切换到nan,因为这是一个很长的字符串,这意味着要解析整个字符串,谢谢你的帮助,因为我一直认为这太复杂了。这个解决方案很简单,据我所知,不会对性能产生巨大影响。