You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:44:48