在Java中,为什么小数分隔符遵循Locale的语言,而不是其国家/地区,更重要的是,如何覆盖它?

Mar*_*nes 8 java locale decimal-point number-formatting

我正在开展一个国际项目,并且观察到,在Java中,小数分隔符的选择基于Locale的语言,而不是其国家.例如:

DecimalFormat currencyFormatter = (DecimalFormat) NumberFormat.getInstance(new Locale("it","IT"));
System.out.println(currencyFormatter.format(-123456.78));

currencyFormatter = (DecimalFormat) NumberFormat.getInstance(new Locale("en","IT"));
System.out.println(currencyFormatter.format(-123456.78));
Run Code Online (Sandbox Code Playgroud)

产生以下输出:

-123.456,78
-123,456.78
Run Code Online (Sandbox Code Playgroud)

我原以为它会跟随这个国家,因为如果我在国内,无论我说英语还是意大利语,那个国家的数字都用小数点分隔符作为逗号.

我的问题是双重的:

  1. 有谁知道为什么这种行为遵循语言?
  2. 更重要的是,任何人都可以提供有关如何修改Java中的默认行为以遵循该语言的详细信息吗?

谢谢.

Joa*_*uer 6

很可能你的系统上没有已知的"en_IT"语言环境,并且Java知道没有这样的语言环境.

因此,您将获得最接近匹配的Locale的资源,如以下JavaDoc中的Locale注释:

当您要求特定区域设置的资源时,您将获得最佳可用匹配,而不一定是您要求的.有关更多信息,请查看ResourceBundle.

相关文件ResourceBundle显示,全国单是从未尝试作为标识符找到一个给定的资源.仅使用语言,语言+国家和语言+国家+变体.

  • +1,这是正确的答案.有*是*没有'en-it`区域设置.如果你不支持`xx-yy`语言环境,那么使用`xx`.你不能"堕落"到意大利; `IT`不具有*语言环境.瑞士有3个地区:**法国**(`fr-ch`),**德国**(`de-ch`)和**意大利**(`it-ch`).你不能"堕落"到*瑞士*,没有"瑞士"这样的语言.如果你要求'en-ch`(英语 - 瑞士语),Java就不能落入`ch`.瑞士没有*一个地方.你问了一个我不认识的英语变体; 但我至少还能给你英语. (4认同)

Pét*_*rök 4

但如果你是一个住在意大利的英国人,你很可能仍然用英语写数字,并在脑子里用英镑数你的钱 - 反之亦然;-)

所以对我来说,这种行为看起来完全合乎逻辑。我担心可能没有办法得到你想要的:-(

根据 Oscar Reyes 的评论进行更新:在 Java 6 中,NumberFormatProvider 使您能够实现您的目标。

  • +1。格式化数字是语言的问题,而不是你所在的位置的问题。 (2认同)