Java Scanner如何解析double类型?

5

我正在使用一台 Windows 7 计算机,其“控制面板\时钟、语言和区域”设置为“丹麦”。

根据Scanner的文档:

扫描仪的初始区域设置是由 Locale.getDefault() 方法返回的值;

但是当我运行代码时:

System.out.println(Locale.getDefault());
Scanner sc = new Scanner("1.0");
sc.nextDouble();

它会输出“en_US”,并在 sc.nextDouble() 处抛出 java.util.InputMismatchException 异常。如果使用“1,0”初始化扫描器,它可以正常工作。

然而,如果我明确设置 Locale:

Locale.setDefault(Locale.US);
System.out.println(Locale.getDefault());
Scanner sc = new Scanner("1.0");
sc.nextDouble();

它输出"en_US",然后成功解析双精度。我有所遗漏吗?还是Scanner文档有误?
编辑:根据@Perception的建议,我查看了第一个示例中的sc.locale()。它打印出"da_DK"。那么当Locale.getDefault()方法返回"en_US"时,为什么不是"en_US"呢?

似乎你的电脑认为它在法国或加拿大法语地区... - Andrew Mao
为什么它会打印出 en_US 呢?但是 @AndrewMao 一定是对的,它对我有效。 - Sotirios Delimanolis
文档的哪一部分不容易理解? - Paul Vargas
1
在你的第一个示例中,sc.locale()会打印什么? - Perception
@Perception 它打印出“da_DK” - 但为什么会这样?文档是否说明它应该从Locale.getDefault()获取Locale? - surlol
@PaulVargas 我不明白的具体问题是,我根据文档解释 Scanner 会从 Locale.getDefault() 中获取 Locale,但实际上它并没有这样做,Scanner 的初始语言环境是 "da_DK"。 - surlol
1个回答

5

有两种不同的Locale类别,一个用于显示,另一个用于格式。扫描器使用Locale.getDefault(Locale.Category.FORMAT),但如果您调用Locale.getDefault(),则会获得显示的语言环境。而setLocale(Locale)方法则同时设置两种类型。


1
谢谢。我似乎在任何文档(针对Scanner)中都找不到这个说明。 - surlol
1
你说得对,官方的JavaDoc是误导性的。甚至还声明了“扫描器的初始区域设置是由Locale.getDefault()方法返回的值”。 - s106mo
javadoc 在 Java 8 中已经修正。 - Stephen C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接