【问题标题】:How to change the locale for JVM?如何更改 JVM 的语言环境?
【发布时间】:2023-03-24 15:34:01
【问题描述】:

这是我的第一个问题,听起来可能很愚蠢,但我找不到解决方案。 我正在学习 Java,我正在做一个练习,从互联网上读取一个带有双格式温度的 txt(即 86.60)。

问题是,正确编译后,当我尝试运行它时,出现以下异常:

Exception in thread "main" java.util.InputMismatchException

这是有问题的方法:

public static double[] arrayFromUrl(String url) throws Exception {
        Scanner fin = new Scanner((new URL(url)).openStream());
        int count = fin.nextInt();

        double[] dubs = new double[count];

        for ( int i=0; i<dubs.length; i++)
            dubs[i] = fin.nextDouble();
        fin.close();

        return dubs;
    }

这是目标文件: https://learnjavathehardway.org/txt/avg-daily-temps-atx.txt

我终于发现这是因为条目的格式,我的 powershell 不接受 xx.xx(点)格式的双精度,但只接受 xx,xx(逗号)。 我认为这是因为我住在意大利,并且我的系统和区域设置是一致的(我们使用逗号表示双打)。如何更改我的 JVM 的语言环境以使其接受 xx.xx 格式的双精度值?

【问题讨论】:

  • 在这里发布整个异常并不是使用完整的。如果您希望得到其他人的帮助,请发布它的上下文。
  • 对不起,正如我所说,第一个问题 :) 我认为这与我的问题无关,但我仍然编辑了添加方法的帖子,以及它读取的文件的链接。跨度>
  • 数据是如何格式化的?如果使用逐行格式,您通常最好使用BufferedReader 并自己解析这些行。此外,请记住将try-with-resources任何外部资源一起使用。
  • 要回答您的实际问题(也许重写您的问题以使其更清楚),您需要 1) 更改 locale of the JVM 或 2) 使用 BufferedReader 和正确的 NumberFormat语言环境或 3) 设置 locale of the Scanner 本身。任何使用点小数分隔符的语言环境都可以,例如Locale.UK
  • 温度为双格式(86.6、45.4 等),我通过修改代码暂时解决了这个问题,并让它读取了一个本地文件,在该文件中我将所有点都更改为逗号,但我想想知道是否有办法让 powershell 接受 xx.xx 格式的双精度而不是 xx,xx(我们在意大利使用的)。

标签: java windows powershell java.util.scanner


【解决方案1】:

要完成这项工作,您必须告诉 Scanner 对象在决定如何解析数字时忽略用户的语言环境。

public static double[] arrayFromUrl(String url) throws Exception {
    Scanner fin = new Scanner((new URL(url)).openStream());
    fin.useLocale(Locale.US);
    int count = fin.nextInt();

    double[] dubs = new double[count];

    for ( int i=0; i<dubs.length; i++)
        dubs[i] = fin.nextDouble();
    fin.close();

    return dubs;
}

还可以通过在 java 命令行中添加以下标志来更改整个 JVM 的系统区域设置:

java -Duser.language=en -Duser.region=US MyClass

【讨论】:

    【解决方案2】:

    在阅读之前使用useLocale() 方法设置Scanner 对象的区域设置。例如

    fin.useLocale(Locale.US);
    

    由于您遇到的原因,稳健的代码和数据不应依赖系统默认语言环境。

    【讨论】:

      猜你喜欢
      • 2013-04-27
      • 1970-01-01
      • 2021-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多