在Java中,类java.util.Scanner
提供了解析长字符串的便捷方法。在我的具体情况下,我必须解析一个字符串,其中包含许多double
值,为此我使用nextDouble()
方法。重新定义扫描仪的非数字识别?
有时候,我的输入字符串包含nan
,而不是一个有效的浮点数。不幸的是,Scanner
似乎只承认NaN
非数字。
有什么办法来教它也承认nan
?也许通过设置一个自定义Locale
与DecimalFormatSymbols.setNaN()
?
在Java中,类java.util.Scanner
提供了解析长字符串的便捷方法。在我的具体情况下,我必须解析一个字符串,其中包含许多double
值,为此我使用nextDouble()
方法。重新定义扫描仪的非数字识别?
有时候,我的输入字符串包含nan
,而不是一个有效的浮点数。不幸的是,Scanner
似乎只承认NaN
非数字。
有什么办法来教它也承认nan
?也许通过设置一个自定义Locale
与DecimalFormatSymbols.setNaN()
?
怎么这样呢?
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();
}
感谢您的帮助,一如既往我想的太复杂了。这个解决方案很简单,从我看到的不会有巨大的性能影响。 – chrset
一个选项是设置自定义Locale
。另一种选择是,在内部扫描仪使用正则表达式来检索双字符串,然后使用Double.parseDouble
将其转换为一个double
,因此你可以使用正则表达式defined here除了使用“楠”呼Scanner#next(Pattern pattern)
而不是“南”,然后在返回的字符串上调用Double.parseDouble
。
你为什么不只是做字符串替换所有的输入,搜索楠和他们转换为NaN –
,因为它是一个相当长的字符串,这意味着解析整个字符串两次 – chrset