用逗号代替点接受双重
Posted
技术标签:
【中文标题】用逗号代替点接受双重【英文标题】:Double accepted with comma instead of dot 【发布时间】:2019-01-30 16:00:14 【问题描述】:我无法从我的 bash 终端在我的程序中输入双精度值。下面是我用来弄清楚为什么会发生的代码。
这是我的测试代码:
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"
【问题讨论】:
请确定:丹麦的常用格式是使用逗号,对吧? 正如 RKrum 指出的那样:Scanner
将使用默认语言环境。目前尚不清楚您有关您的语言环境的信息来自何处,但基本上将Locale.setDefault(Locale.ENGLISH);
称为“main
方法的第一行”应该值得一试...
【参考方案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();
【讨论】:
替换可能有点脆弱。根据.
或,
是标准分隔符,数字1,234
可能表示1.234
或1234
。因此,在尝试修复这个问题之前,首先弄清楚它为什么会出现可能是值得的......
有道理。感谢您的提醒!通过一些实验改变了我的答案
感谢您的帮助。我有办法将美国语言环境设置为我的 JVM 的默认设置吗?所以我不必在每个程序中明确定义它
user10991282 区域设置根据您的系统设置以不同的方式确定。你可以在这里做一些阅读:oracle.com/technetwork/articles/javase/locale-140624.html#using
或者,在启动应用程序时使用 JVM 参数设置它应该可以工作。示例:“java -Duser.country=US -Duser.language=en -jar yourJar.jar”以上是关于用逗号代替点接受双重的主要内容,如果未能解决你的问题,请参考以下文章