怎么通过 Scanner.useLocale() 设定读取模式以支持不同国家的小数点号(点或逗号)
Scanner.useLocale()可指定区域规则解析数字,如Locale.US识别点号为小数点,Locale.GERMAN识别逗号为小数点。切换区域后输入格式必须严格匹配,否则抛出异常。混合含千分位和小数点的输入建议手动预处理并统一格式,以避免解析冲突。
先说结论:Scanner.useLocale() 是 Ja va 中一个容易被忽视但非常实用的方法。它的核心作用,就是让 Scanner 在解析数字时,按照指定区域的格式规则来识别小数点、千分位分隔符这些符号。换句话说,你只要给它一个 Locale,它就能自动读懂“3.14”和“3,14”之间的差异——当然,前提是这个 Locale 要设对。
那么,具体怎么用?本文从三个方面展开。

指定 Locale 后,Scanner 自动识别对应的小数分隔符
Scanner 在底层调用的是 DecimalFormat 和 NumberFormat 的解析规则。举个例子:
Locale.US(也是默认值)认为小数点是.,千分位是,。所以"3.14"能被正常解析成 3.14,"3,141.59"也能被正确识别为 3141.59。但如果你给它"3,14",它会当成整数 3,因为逗号被当成千分位符号了。- 反过来,
Locale.GERMAN或Locale.FRANCE的规则是小数用,,千分位用.。所以"3,14"可以正常解析,"3.14"反而会抛出异常——因为点号在德语的语境里并不是小数点。
来看一段代码:
Scanner sc = new Scanner("3,14\n42");
sc.useLocale(Locale.GERMAN);
double pi = sc.nextDouble(); // 成功读出 3.14
int n = sc.nextInt(); // 成功读出 42
需要提醒的是:假如输入是 "3.14" 但 locale 设成了 GERMAN,那 nextDouble() 会直接抛出 InputMismatchException,因为点号在德语环境中不被当作小数分隔符。
常见国家/地区对应的 Locale 和小数分隔符
下面这张表汇总了常用区域的关键配置:
| 国家/地区 | 推荐 Locale | 小数分隔符 | 千位分隔符 | 示例数字字符串 |
|---|---|---|---|---|
| 美国、英国、澳大利亚 | Locale.US / Locale.UK |
. |
, |
"1234.56" |
| 德国、奥地利、瑞士德语区 | Locale.GERMAN / new Locale("de", "DE") |
, |
. |
"1.234,56" |
| 法国、比利时法语区 | Locale.FRANCE / new Locale("fr", "FR") |
, |
(空格) |
"1 234,56" |
| 巴西 | new Locale("pt", "BR") |
, |
. |
"1.234,56" |
几个实用的建议:
- 尽量用
Locale.GERMAN或new Locale("de")这样的形式,避免硬编码字符串"de_DE",更安全也更清晰。 - 如果需要精细控制(比如巴西的
pt_BR),用显式构造:new Locale("pt", "BR")。 - 中文环境(
Locale.CHINA)默认小数点和美国一样是.,所以不需要额外切换。
处理混合格式或未知 Locale 的输入
Scanner 不会像人一样“猜”输入字符串里的小数点是点还是逗号。如果输入格式不固定,用户可能在某个字段里用了 .、另一个字段里用了 ,,那 useLocale() 就显得力不从心了。这时候的做法是:
- 先用
next()把原始字符串读出来; - 手动做预处理,比如统一替换:把所有
,换成.,然后用Double.parseDouble()来解析; - 或者借助
NumberFormat配合ParsePosition尝试多个 Locale。
代码示例:
String raw = sc.next();
String normalized = raw.replace(',', '.'); // 粗略兼容:仅适用于无千位分隔符场景
double value = Double.parseDouble(normalized);
不过这种方法有隐患——如果输入是 "1.234,56",那替换后就成了 "1.234.56",完全错误。更健壮的方案是先判断字符串里哪个符号只出现一次且位于数字中间,然后再决定替换逻辑。不过,这已经超出 Scanner 的职责范围了。
看起来不复杂,但确实容易忽略。在跨区域数据处理场景下,这个小细节往往就是 bug 的源头。
Postman是一套面向API全生命周期的开发与测试平台,可在Mac上发送和调试多种协议请求,管理集合、环境及认证信息,并完成脚本测试、模拟服务、监控、文档发布和团队协作。它适合开发、测试及运维人员使用,提供个人免费方案。
Docker Desktop 是 Docker 官方为 Mac 提供的容器开发环境,集成 Docker Engine、命令行工具、Compose、Build、Kubernetes 与图形化管理界面。
Android Studio 是 Google 面向安卓应用开发提供的官方集成开发环境,基于 IntelliJ IDEA 构建。它整合智能代码编辑、Gradle 构建、界面预览、设备模拟、性能分析、调试测试及 APK 分析等工具。
PixPix 是面向品牌、卖家和内容团队的在线 AI 图片视频创作平台,提供图视频 Agent、无限画布、图片生成、视频生成、自然语言编辑及商品套图、产品精修和带货视频等电商工具。
Postman 是面向 API 全生命周期的开发与协作平台。Windows 桌面版可用于构建和发送 HTTP、GraphQL、gRPC、WebSocket、MQTT 等请求,并提供环境变量、集合、脚本测试、模拟服务、监控、文档及团队工作区等
Docker Desktop 为 Windows 开发者提供集成式容器环境,内置 Docker Engine、命令行工具、Compose、Build 与 Kubernetes 等组件,可在本机完成镜像构建、容器运行、日志查看和资源管理。













