更改Java语言环境

时间:2015-04-10 22:51:35

标签: java java-8 javafx-8

我想通过这种方式设置Locale

Locale ar = new Locale.Builder().setLanguageTag("ar-SA-u-nu-arab").build();
Locale.setDefault(ar);

我正在尝试将编号系统从拉丁语系统更改为阿拉伯语系统 当我打电话的时候

int i = 1000;
System.out.println(i);

在我使用NumberFormat

之前,它不会改变它仍为拉丁语的编号系统
NumberFormat nf = NumberFormat.getNumberInstance(ar);
String s = nf.format(i);
System.out.println(s);

通过这种方式,它在阿拉伯数字中正确打印。 我需要一种方法来显示阿拉伯语中的所有数字,所以请帮忙。

2 个答案:

答案 0 :(得分:2)

System.out.println(i);

定义为区域设置不敏感的操作,不受更改默认Locale的影响。

您可以诉诸

System.out.printf("%d%n", i);

确实尊重语言环境。


详细说明一下:

的println

documentation of PrintStream.println(int)指定:

  

打印一个整数,然后终止该行。此方法的行为就像调用print(int)然后调用println()

print(int) is specified

  

打印整数。 String.valueOf(int)生成的字符串根据平台的默认字符编码转换为字节,这些字节的编写方式与write(int)方法完全相同。

引导我们String.valueOf(int)

  

返回int参数的字符串表示形式。

     

表示正好是一个参数的Integer.toString方法返回的表示。

Integer.toString(int)

  

返回表示指定整数的String对象。参数将转换为带符号的十进制表示形式并作为字符串返回,就像参数和基数10作为toString(int, int)方法的参数一样。

toString(int, int)

  

[...]   如果第一个参数为负数,则结果的第一个元素是ASCII减去字符'-''\u002D')。如果第一个参数不是负数,则结果中不会出现符号字符。

     

结果的其余字符表示第一个参数的大小。如果幅度为零,则由单个零字符'0''\u0030')表示;否则,幅度表示的第一个字符将不是零字符。以下ASCII字符用作数字:

     
    

0123456789abcdefghijklmnopqrstuvwxyz

  
     

这些是'\u0030''\u0039''\u0061''\u007A'。 ...

因此,在这条漫长道路的尽头,我们看到一个规范没有为特定于语言环境的结果留下空间。

的printf

specification of PrintStream.printf比较(请注意,即使是overloaded method taking a Locale as first argument):

  

使用指定的格式字符串和参数将格式化字符串写入此输出流的便捷方法。

     

调用out.printf(format, args)形式的此方法的行为与调用的方式完全相同

     
    

out.format(format, args)

  
     

参数:

     

format - Format string syntax

中描述的格式字符串

Format String Syntax是一个非常大的规范。我们必须查看section “Byte, Short, Integer, and Long”

  

以下转化可能适用于byteByteshortShortintInteger,{{1} }和long

     

Long 'd'将参数格式化为十进制整数。 localization algorithm已应用。

     

[...]

localization algorithm恰好在该部分的正上方描述:

  

号码本地化算法

     

获得整数部分,小数部分和指数(适用于数据类型)的数字后,将应用以下转换:

     
      
  1. 字符串中的每个数字字符 d 将替换为相对于当前区域设置计算的特定于区域设置的数字zero digit z ;那是 d - '\u0064' + z
  2.   
  3. 如果存在小数分隔符,则替换特定于语言环境的decimal separator
  4.   
  5. 如果给出了'0'',')标志,则通过将字符串的整数部分从最低有效位扫描到最有效数字并插入来插入特定于语言环境的grouping separator由区域设置定义的分隔符grouping size
  6.   
  7. 如果给出了'\u002c'标志,则在符号字符(如果有)和第一个非零数字之前插入特定于语言环境的zero digits,直到字符串的长度为等于请求的字段宽度。
  8.   
  9. 如果值为负且提供了'0'标记,则前缀为'(''('),'\u0028'')')为追加。
  10.   
  11. 如果值为负(或浮点负零)并且未给出'\u0029'标记,则前缀为'(''-')。
  12.   
  13. 如果给出'\u002d'标志并且值为正或零(或浮点正零),则将'+''+')作为前缀。
  14.         

    如果值为NaN或正无穷大,则为字符串" NaN"或" Infinity"分别将输出。如果该值为负无穷大,那么输出将为"(无穷大)"如果给出'\u002b'标志,否则输出将为" -Infinity"。这些值未本地化。

答案 1 :(得分:0)

也许您可以尝试为程序中的所有Swing组件设置默认语言环境:

Locale ar = new Locale.Builder().setLanguageTag("ar-SA-u-nu-arab").build();
JComponent.setDefaultLocale(ar);