Java 接受双精度,用逗号代替点

Java 接受双精度,用逗号代替点,java,terminal,double,locale,comma,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.

我无法从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"

您的
扫描仪
可能正在使用
丹麦
地区
,因为它使用
格式化双变量,而不是我们默认的

以下是如何检查它(我尝试在本地强制我的扫描仪使用丹麦语言环境,其行为与您的实验中相同):

如果这是您的情况,您需要将其设置为使用US
语言环境
或您想要的任何其他语言:

Scanner sc = new Scanner(System.in);
sc.useLocale(Locale.US);
System.out.println(sc.locale().getDisplayCountry());
或者,如果您需要同时接受
,您可以简单地使用格式化程序。下面是一个使用
France
作为区域设置的
NumberFormat
示例,它正确地格式化了

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();
    }
} 

可以肯定的是:丹麦常用的格式是使用逗号,对吗?正如RKrum指出的:
扫描仪将使用默认的区域设置。不清楚您的区域设置信息来自何处,但是调用
locale.setDefault(locale.ENGLISH)基本上是“你的
main
方法的第一行”,应该值得一试……替换可能有点脆弱。根据
还是
是标准分隔符,数字
1234
可能表示
1.234
1234
。因此,在试图解决这个问题之前,也许有必要先弄清楚它为什么会出现……这是有意义的。谢谢你的提醒!用一些实验改变了我的答案谢谢你的帮助。有没有办法将US语言环境设置为JVM的默认语言环境?因此,我不必在每个程序中显式定义它User10991282语言环境是根据您的系统设置以不同的方式确定的。您可以在这里阅读一下:或者,在启动应用程序时使用JVM参数设置它应该可以工作。示例:“java-Duser.country=US-Duser.language=en-jar yourJar.jar”
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();
    }
}