用逗号代替点接受双重

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.2341234。因此,在尝试修复这个问题之前,首先弄清楚它为什么会出现可能是值得的...... 有道理。感谢您的提醒!通过一些实验改变了我的答案 感谢您的帮助。我有办法将美国语言环境设置为我的 JVM 的默认设置吗?所以我不必在每个程序中明确定义它 user10991282 区域设置根据您的系统设置以不同的方式确定。你可以在这里做一些阅读:oracle.com/technetwork/articles/javase/locale-140624.html#using 或者,在启动应用程序时使用 JVM 参数设置它应该可以工作。示例:“java -Duser.country=US -Duser.language=en -jar yourJar.jar”

以上是关于用逗号代替点接受双重的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC3 双重验证(逗号、点、空)

更改时间跨度毫秒分隔符;逗号(,)代替点(。)[重复]

NumericUpDown:接受逗号和点作为小数分隔符

openxlsx格式的单元格为带逗号的数字,0值用破折号代替

如何使文本框只接受数字并用逗号格式化数字?

c ++:用逗号格式化数字?