我无法从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"
答案 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();
}
}