Java Scanner.hasNextDouble无法识别"1.0"却识别"1,0"问题求助
踩坑记录:Java Scanner解析混合数值时的反直觉行为
折腾了好久才搞明白这个问题,必须分享出来让大家少走弯路!
前阵子我用Java的Scanner处理一段混合了整数和浮点数的输入:1.0,2.0,5.0,10,用逗号作为分隔符,写了这段代码来解析:
Scanner scan = new Scanner("1.0,2.0,5.0,10"); scan.useDelimiter("[, ]"); while(scan.hasNext()) { if(scan.hasNextDouble()) { System.out.println(scan.nextDouble()); } else { System.out.println("Other:"+scan.next()); } }
结果输出完全超出预期:
Other:1.0 Other:2.0 Other:5.0 10.0
你敢信?带小数点的1.0、2.0居然被判定为非浮点数,反而纯整数10被识别成了double类型!
背后的原因:Locale搞的鬼
后来查了Scanner的逻辑才发现,它的数值解析是依赖**系统默认区域设置(Locale)**的。如果你的系统默认Locale是用逗号作为小数点分隔符的(比如法语区的Locale),那Scanner会把输入中的.当成普通符号,而非小数点。
举个例子,在Locale.FRANCE环境下,合法的浮点数格式是1,0而不是1.0,所以1.0会被Scanner判定为无法解析成double的字符串,直接走到else分支;而纯整数10不受小数点格式影响,自然能被解析成double。
解决办法:强制指定Locale
要解决这个问题很简单,只需要在初始化Scanner时,明确指定使用小数点为.的Locale(比如Locale.US):
Scanner scan = new Scanner("1.0,2.0,5.0,10").useLocale(Locale.US); scan.useDelimiter("[, ]"); while(scan.hasNext()) { if(scan.hasNextDouble()) { System.out.println(scan.nextDouble()); } else { System.out.println("Other:"+scan.next()); } }
修改之后再运行,输出就完全符合预期了:
1.0 2.0 5.0 10.0
内容的提问来源于stack exchange,提问作者user7546831
相关产品推荐
相关产品推荐

