用逗号而不是点双接受

时间:2019-01-30 16:00:14

标签: java terminal double locale comma

我无法从bash终端在程序中输入doubles值。下面是我用来弄清楚其原因的代码。

这是我的测试代码:

import java.util.*;
public class DoubleTest {
    public static void main (String[] args) {
        Scanner sc = new Scanner(System.in);

        double n = sc.nextDouble();
        System.out.println(n);
    } 
}

使用以下输入5,我得到了预期的结果。

user $ java DoubleTest
   5
   5.0

现在到有趣的部分。我输入了代码中声明的Double,然后发生了:

user $ java DoubleTest
5.0
Exception in thread "main" java.util.InputMismatchException
at java.base/java.util.Scanner.throwFor(Scanner.java:939)
at java.base/java.util.Scanner.next(Scanner.java:1594)
at java.base/java.util.Scanner.nextDouble(Scanner.java:2564)
at DoubleTest.main(DoubleTest.java:6)

当给出的值为5,0时,结果如下:

user $ java DoubleTest
5,0
5.0

因此,似乎.(点)无法正常工作,而,(逗号)却可以正常工作。

我已经检查了我的语言环境,但这不应该是问题。

LANG="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_CTYPE="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_ALL="en_US.UTF-8"

1 个答案:

答案 0 :(得分:1)

您的Scanner可能正在使用Denmark Locale,因为它使用,来格式化双变量而不是美国默认的.

您可以在此处进行检查(我在本地尝试强制扫描器使用丹麦语言环境,并且其行为与实验中的行为相同):

Scanner sc = new Scanner(System.in);
System.out.println(sc.locale().getDisplayCountry());

如果是这种情况,则需要将其设置为使用美国Locale或您想要的其他任何类型:

Scanner sc = new Scanner(System.in);
sc.useLocale(Locale.US);
System.out.println(sc.locale().getDisplayCountry());

或者,如果您需要同时接受,.,则可以简单地使用格式化程序。这是一个使用NumberFormat作为区域设置的France的示例,它可以正确设置,.的格式:

NumberFormat numberFormat = NumberFormat.getInstance(Locale.FRANCE);
double doubleComma = numberFormat.parse("5,0").doubleValue();
double doubleDot = numberFormat.parse("5.0").doubleValue();

在您的代码中,您将执行以下操作:

public static void main (String[] args) {
    try{
        Scanner sc = new Scanner(System.in);

        NumberFormat numberFormat = NumberFormat.getInstance(Locale.FRANCE);
        double n = numberFormat.parse(sc.next()).doubleValue();
        System.out.println(n);
    } catch (ParseException e) {
        e.printStackTrace();
    }
}