Scanner.nextFloat的奇怪行为

时间:2013-09-25 09:40:56

标签: java localization java.util.scanner

如果我执行以下代码:

import java.util.Scanner;

public class ScannerTest {

    public static void main(String[] args) {

        Scanner s = null;
        StringBuilder builder = new StringBuilder(64);
        String line = "1.1 2.2 3.3";
        float fsum = 0.0f;      

        s = new Scanner(line).useDelimiter(" ");

        while (s.hasNextFloat()){
            float f = s.nextFloat();
            fsum += f;
            builder.append(f).append(" ");
        }
        System.out.println("Floats found: " + builder);
        System.out.println("Sum: " + fsum);
        s.close();
    }
}

我的输出是:

Floats found: 
Sum: 0.0

但是,如果我在第"1,1 2,2 3,3"行中用逗号替换点,那么它确实识别浮点数:

Floats found: 1.1 2.2 3.3 
Sum: 6.6000004

我想这是因为我的SO是西班牙语,我们使用逗号代替带小数的点。我想过使用Locale,但是没有Locale.SPANISH。

此外,当我运行它时,它的行为正好相反:

public class StringToFloatTest {

    public static void main(String[] args) {
        String st = "1,1";
        float f = Float.parseFloat(st);
        System.out.println(f);
    }
}

此代码会产生NumberFormatException,但如果我使用String st = "1.1"则会有效。

有人可以解释为什么会发生这种情况吗?如何让扫描仪识别浮点数?

2 个答案:

答案 0 :(得分:5)

  

有人可以解释为什么会发生这种情况

正如您所说,它使用您的默认语言环境。打印Locale.getDefault()以检查您的默认语言区域。

请注意,Float.parseFloat 不是特定于语言环境。

  

如何让扫描仪识别浮点数?

致电s.useLocale(Locale.US);

答案 1 :(得分:0)

Java 7 default locale中描述了Java默认语言环境选择过程。

以下是如何在不改变源代码的情况下在外部进行更改: how do I set the default locale for my JVM?