2013-04-14 26 views
0

在Java中,类java.util.Scanner提供了解析长字符串的便捷方法。在我的具体情况下,我必须解析一个字符串,其中包含许多double值,为此我使用nextDouble()方法。重新定义扫描仪的非数字识别?

有时候,我的输入字符串包含nan,而不是一个有效的浮点数。不幸的是,Scanner似乎只承认NaN非数字。

有什么办法来教它也承认nan?也许通过设置一个自定义LocaleDecimalFormatSymbols.setNaN()

+0

你为什么不只是做字符串替换所有的输入,搜索楠和他们转换为NaN –

+0

,因为它是一个相当长的字符串,这意味着解析整个字符串两次 – chrset

回答

1

怎么这样呢?

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(); 
} 
+0

感谢您的帮助,一如既往我想的太复杂了。这个解决方案很简单,从我看到的不会有巨大的性能影响。 – chrset

1

一个选项是设置自定义Locale。另一种选择是,在内部扫描仪使用正则表达式来检索双字符串,然后使用Double.parseDouble将其转换为一个double,因此你可以使用正则表达式defined here除了使用“楠”呼Scanner#next(Pattern pattern)而不是“南”,然后在返回的字符串上调用Double.parseDouble