Java 接受双精度,用逗号代替点
我无法从bash终端在程序中输入doubles值。下面是我用来解释为什么会发生这种情况的代码 这是我的测试代码: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.
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();
}
}