Java 国际化 - 快速指南



Java 国际化 - 概述

国际化或 I18N 指的是应用程序能够为多个不同语言的用户提供服务的能力。Java 内置了对国际化的支持。Java 还提供数字、货币的格式化以及日期和时间的相应调整。

Java 国际化有助于使 Java 应用程序能够处理不同的语言、数字格式、货币、特定区域的时间格式。

本地化

本地化或 L10N 是应用程序的适应性,即应用程序如何根据特定的语言、数字格式、日期和时间设置等进行调整。

为了能够进行本地化,Java 应用程序应该进行国际化。

文化相关信息

以下信息项通常会因不同的时区或文化而异。

  • 消息

  • 日期

  • 时间

  • 数字

  • 货币

  • 度量衡

  • 电话号码

  • 邮政地址

  • GUI 标签

国际化类

Java 有一组内置类,有助于应用程序的国际化。这些类如下所示

序号类和描述
1

Locale

表示一种语言以及国家/地区。

2

ResourceBundle

包含本地化的文本或对象。

3

NumberFormat

用于根据区域设置格式化数字/货币。

4

DecimalFormat

用于根据自定义格式和区域设置格式化数字。

5

DateFormat

用于根据区域设置格式化日期。

6

SimpleDateFormat

用于根据自定义格式和区域设置格式化日期。

Java 国际化 - 环境设置

在本章中,我们将讨论为 Java 设置良好环境的不同方面。

本地环境设置

如果您仍然希望为 Java 编程语言设置环境,那么本节将指导您如何在计算机上下载和设置 Java。以下是设置环境的步骤。

Java SE 可从以下链接免费获取 下载 Java。您可以根据您的操作系统下载版本。

按照说明下载 Java 并运行.exe文件以在您的计算机上安装 Java。在您的计算机上安装 Java 后,您需要设置环境变量以指向正确的安装目录 -

为 Windows 设置路径

假设您已将 Java 安装在c:\Program Files\java\jdk目录中 -

  • 右键单击“我的电脑”,然后选择“属性”。

  • 在“高级”选项卡下单击“环境变量”按钮。

  • 现在,更改“Path”变量,使其还包含 Java 可执行文件的路径。例如,如果路径当前设置为“C:\WINDOWS\SYSTEM32”,则将路径更改为“C:\WINDOWS\SYSTEM32;c:\Program Files\java\jdk\bin”。

为 Linux、UNIX、Solaris、FreeBSD 设置路径

环境变量 PATH 应设置为指向 Java 二进制文件安装的位置。如果您在执行此操作时遇到问题,请参考您的 shell 文档。

例如,如果您使用bash作为您的 shell,则您将在“.bashrc”的末尾添加以下行:export PATH = /path/to/java:$PATH'

流行的 Java 编辑器

要编写 Java 程序,您将需要一个文本编辑器。市场上甚至还有更复杂的 IDE 可供使用。但目前,您可以考虑以下其中一个 -

  • 记事本 - 在 Windows 计算机上,您可以使用任何简单的文本编辑器,如记事本(本教程推荐使用),TextPad。

  • Netbeans - 一个开源且免费的 Java IDE,可以从 https://www.netbeans.org/index.html 下载。

  • Eclipse - 由 Eclipse 开源社区开发的 Java IDE,可以从 https://www.eclipse.org/ 下载。

接下来是什么?

下一章将教您如何编写和运行您的第一个 Java 程序以及开发应用程序所需的一些重要的基本 Java 语法。

Java 国际化 - Locale 类

Locale 对象表示特定的地理/政治/文化区域。任何需要 Locale 来执行其任务的操作都称为区域设置敏感操作,并使用 Locale 来掌握与用户相关的信息。例如,显示数字是一个区域设置敏感操作。数字应根据用户本国、地区或文化的习俗和惯例进行格式化。

Locale 内容

Locale 对象包含以下内容

  • 语言 - ISO 639 alpha-2 或 alpha-3 语言代码,或最多 8 个字母的已注册语言子标签。如果同时存在 alpha-2 和 alpha-3 代码,则必须使用 alpha-2 代码。语言字段不区分大小写,但 Locale 始终规范化为小写。

  • 脚本 - ISO 15924 alpha-4 脚本代码。脚本字段不区分大小写,但 Locale 始终规范化为标题大小写。

  • 国家/地区 - ISO 3166 alpha-2 国家代码或联合国 M.49 数字 3 区号。国家/地区字段不区分大小写,但 Locale 始终规范化为大写。

  • 变体 - 用于指示 Locale 变体的任意值。当有两个或多个变体值,每个值都指示其自己的语义时,这些值应按重要性排序,最重要的值排在最前面,并用下划线(_)分隔。变体字段区分大小写。

  • 扩展 - 从单个字符键到字符串值的映射,指示除语言识别之外的扩展。Locale 中的扩展实现 BCP 47 扩展子标签和专用用途子标签的语义和语法。扩展不区分大小写,但 Locale 将所有扩展键和值规范化为小写。

Java 国际化 - 示例 - Locale 细节

在本例中,我们将获取默认区域设置并打印其详细信息。然后为“fr”创建一个区域设置并打印其详细信息。

示例

import java.util.Locale;

public class I18NTester {
   public static void main(String[] args) {
      Locale locale =Locale.getDefault();  

      System.out.println("Default Locale Properties:\n");

      System.out.println(locale.getDisplayCountry());  
      System.out.println(locale.getDisplayLanguage());  
      System.out.println(locale.getDisplayName());  
      System.out.println(locale.getISO3Country());  
      System.out.println(locale.getISO3Language());  
      System.out.println(locale.getLanguage());  
      System.out.println(locale.getCountry());  

      Locale frenchLocale = new Locale("fr","fr");

      System.out.println("\nfr Locale Properties:\n");
      System.out.println(frenchLocale.getDisplayCountry());  
      System.out.println(frenchLocale.getDisplayLanguage());  
      System.out.println(frenchLocale.getDisplayName());  
      System.out.println(frenchLocale.getISO3Country());  
      System.out.println(frenchLocale.getISO3Language());  
      System.out.println(frenchLocale.getLanguage());  
      System.out.println(frenchLocale.getCountry());  
   }
}

输出

它将打印以下结果。

Default Locale Properties:

United States
English
English (United States)
USA
eng
en
US

fr Locale Properties:

France
French
French (France)
FRA
fra
fr
FR

Java 国际化 - 示例 - 显示语言

在本例中,我们将获取作为参数传递的区域设置的显示语言。

示例

import java.util.Locale;

public class I18NTester {
   public static void main(String[] args) {
      Locale defaultLocale = Locale.getDefault();
      Locale enLocale = new Locale("en", "US");  
      Locale frLocale = new Locale("fr", "FR");  
      Locale esLocale = new Locale("es", "ES");

      System.out.println(defaultLocale.getDisplayLanguage(enLocale));
      System.out.println(defaultLocale.getDisplayLanguage(frLocale));
      System.out.println(defaultLocale.getDisplayLanguage(esLocale));
   }
}

输出

它将打印以下结果。

English
anglais
inglés

Java 国际化 - ResourceBundle 类

ResourceBundle 类用于存储对区域设置敏感的文本和对象。通常我们使用属性文件来存储特定于区域设置的文本,然后使用 ResourceBundle 对象来表示它们。以下是如何在基于 Java 的应用程序中使用特定于区域设置的属性文件。

步骤 1:创建属性文件。

假设我们需要为英语区域设置创建属性文件。然后创建一个名为 XXX_en_US.properties 的属性文件,其中 XXX 是文件名,en_US 表示英语(美国)的区域设置。

Messages_en_US.properties

message=Welcome to TutorialsPoint.COM!

现在让我们为法语区域设置创建属性文件。然后创建一个名为 XXX_fr_FR.properties 的属性文件,其中 XXX 是文件名,fr_FR 表示法语(法国)的区域设置。

Messages_fr_FR.properties

message=Bienvenue sur TutorialsPoint.COM!

在这里您可以看出键是相同的,但两个属性文件中的值是特定于区域设置的。

步骤 2:创建 ResourceBundle 对象

使用以下语法创建具有属性文件名和区域设置的 ResourceBundle 对象。

ResourceBundle bundle = ResourceBundle.getBundle("Messages", Locale.US);

步骤 3:从 ResourceBundle 对象获取值

通过传递键从 ResourceBundle 对象获取值。

String value = bundle.getString("message");

示例

以下示例说明了如何使用 ResourceBundle 对象从属性文件中显示特定于区域设置的值。

import java.util.Locale;
import java.util.ResourceBundle;

public class I18NTester {
   public static void main(String[] args) {
      ResourceBundle bundle = ResourceBundle.getBundle("Messages", Locale.US);  
      System.out.println("Message in "+Locale.US +": "+bundle.getString("message"));  

      bundle = ResourceBundle.getBundle("Messages", Locale.FRANCE);  
      System.out.println("Message in "+Locale.FRANCE +": "+bundle.getString("message"));
   }
}

输出

它将打印以下结果。

Message in en_US: Welcome to TutorialsPoint.COM!
Message in fr_FR: Bienvenue sur TutorialsPoint.COM!

命名约定说明

以下是属性文件的命名约定。

  • 对于映射到默认区域设置的属性文件,没有前缀是强制性的。message_en_US.properties 等效于 message.properties。

  • 对于映射到区域设置的属性文件,可以以两种方式附加前缀。message_fr.properties 等效于 message_fr_FR.properties。

Java 国际化 - NumberFormat 类

java.text.NumberFormat 类用于根据特定的区域设置格式化数字和货币。数字格式因国家/地区而异。例如,在丹麦,数字的小数部分与整数部分用逗号分隔,而在英国,他们使用点作为分隔符。

示例 - 格式化数字

在本例中,我们将根据美国区域设置和丹麦区域设置格式化数字。

import java.text.NumberFormat;
import java.util.Locale;

public class I18NTester {
   public static void main(String[] args) {
      Locale enLocale = new Locale("en", "US");  
      Locale daLocale = new Locale("da", "DK");

      NumberFormat numberFormat = NumberFormat.getInstance(daLocale);

      System.out.println(numberFormat.format(100.76));

      numberFormat = NumberFormat.getInstance(enLocale);

      System.out.println(numberFormat.format(100.76));
   }
}

输出

它将打印以下结果。

100,76
100.76

Java 国际化 - 格式化货币

示例

在本例中,我们将根据美国区域设置和丹麦区域设置格式化货币。

import java.text.NumberFormat;
import java.util.Locale;

public class I18NTester {
   public static void main(String[] args) {
      Locale enLocale = new Locale("en", "US");  
      Locale daLocale = new Locale("da", "DK");

      NumberFormat numberFormat = NumberFormat.getCurrencyInstance(daLocale);

      System.out.println(numberFormat.format(100.76));

      numberFormat = NumberFormat.getCurrencyInstance(enLocale);

      System.out.println(numberFormat.format(100.76));
   }
}

输出

它将打印以下结果。

kr 100,76
$100.76

Java 国际化 - 格式化百分比

示例

在本例中,我们将数字格式化为百分比格式。

import java.text.NumberFormat;
import java.util.Locale;

public class I18NTester {
   public static void main(String[] args) {
      Locale enLocale = new Locale("en", "US");        

      NumberFormat numberFormat = NumberFormat.getPercentInstance(enLocale);

      System.out.println(numberFormat.format(0.76));    
   }
}

输出

它将打印以下结果。

76%

Java 国际化 - 设置最小/最大精度

示例

在本例中,我们将为数字的整数部分和小数部分设置最小和最大位数。

import java.text.NumberFormat;
import java.util.Locale;

public class I18NTester {
   public static void main(String[] args) {
      Locale enLocale = new Locale("en", "US");  

      NumberFormat numberFormat = NumberFormat.getInstance(enLocale);
      numberFormat.setMinimumIntegerDigits(2);
      numberFormat.setMaximumIntegerDigits(3);

      numberFormat.setMinimumFractionDigits(2);
      numberFormat.setMaximumFractionDigits(3);

      System.out.println(numberFormat.format(12234.763443));
   }
}

输出

它将打印以下结果。

234.763

Java 国际化 - 设置舍入模式

示例

在本例中,我们将展示舍入模式。

import java.math.RoundingMode;
import java.text.NumberFormat;
import java.util.Locale;

public class I18NTester {
   public static void main(String[] args) {
      Locale enLocale = new Locale("en", "US");  
 
      NumberFormat numberFormat = NumberFormat.getInstance(enLocale);

      numberFormat.setMinimumFractionDigits(0);
      numberFormat.setMaximumFractionDigits(0);

      System.out.println(numberFormat.format(99.50));

      numberFormat.setRoundingMode(RoundingMode.HALF_DOWN);

      System.out.println(numberFormat.format(99.50));
   }
}

输出

它将打印以下结果。

100
99

Java 国际化 - 解析数字

示例

在本例中,我们将展示存在于不同区域设置中的数字的解析。

import java.text.NumberFormat;
import java.text.ParseException;
import java.util.Locale;

public class I18NTester {
   public static void main(String[] args) throws ParseException {
      Locale enLocale = new Locale("en", "US");  
      Locale daLocale = new Locale("da", "DK");

      NumberFormat numberFormat = NumberFormat.getInstance(daLocale);

      System.out.println(numberFormat.parse("100,76"));

      numberFormat = NumberFormat.getInstance(enLocale);

      System.out.println(numberFormat.parse("100,76"));
   }
}

输出

它将打印以下结果。

100.76
10076

Java 国际化 - DecimalFormat 类

java.text.DecimalFormat 类用于根据自定义格式和区域设置格式化数字。

示例 - 格式化数字

在本例中,我们将根据给定的模式格式化数字。

import java.text.DecimalFormat;

public class I18NTester {
   public static void main(String[] args) {
      String pattern = "####,####.##";
      double number = 123456789.123;
      
      DecimalFormat numberFormat = new DecimalFormat(pattern);

      System.out.println(number);
      
      System.out.println(numberFormat.format(number));
   }
}

输出

它将打印以下结果。

1.23456789123E8
1,2345,6789.12

Java 国际化 - 格式化模式

以下是字符在格式化模式中的用法。

序号类和描述
1

0

如果位数较少,则显示 0。

2

#

显示数字,省略前导零。

3

.

小数分隔符。

4

,

分组分隔符。

5

E

指数格式的尾数和指数分隔符。

6

;

格式分隔符。

7

-

负数前缀。

8

%

将数字显示为百分比,乘以 100 后。

9

?

将数字显示为千分之一,乘以 1000 后。

10

X

标记字符为数字前缀/后缀。

11

'

在特殊字符周围加上引号。

示例

在本例中,我们将根据不同的模式格式化数字。

import java.text.DecimalFormat;

public class I18NTester {
   public static void main(String[] args) {
      String pattern = "###.###";
      double number = 123456789.123;

      DecimalFormat numberFormat = new DecimalFormat(pattern);

      System.out.println(number);

      //pattern ###.###
      System.out.println(numberFormat.format(number));

      //pattern ###.#
      numberFormat.applyPattern("###.#");
      System.out.println(numberFormat.format(number));

      //pattern ###,###.##
      numberFormat.applyPattern("###,###.##");
      System.out.println(numberFormat.format(number));

      number = 9.34;

      //pattern 000.###
      numberFormat.applyPattern("000.##");
      System.out.println(numberFormat.format(number));           
   }
}

输出

它将打印以下结果。

1.23456789123E8
1,2345,6789.12

Java 国际化 - 基于区域设置的 DecimalFormat

默认情况下,DecimalFormat 对象使用 JVM 的区域设置。我们可以使用 NumberFormat 类在创建 DecimalFormat 对象时更改默认区域设置。在下面的示例中,我们将对两个不同的区域设置使用相同的模式,您可以发现输出结果的差异。

示例

import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;

public class I18NTester {
   public static void main(String[] args) {
      String pattern = "###.##";
      double number = 123.45;

      Locale enlocale  = new Locale("en", "US");
      Locale dalocale  = new Locale("da", "DK");

      DecimalFormat decimalFormat = (DecimalFormat) NumberFormat.getNumberInstance(enlocale);
      decimalFormat.applyPattern(pattern);

      System.out.println(decimalFormat.format(number));   

      decimalFormat = (DecimalFormat) NumberFormat.getNumberInstance(dalocale);
      decimalFormat.applyPattern(pattern);

      System.out.println(decimalFormat.format(number));     
   }
}

输出

它将打印以下结果。

123.45
123,45

Java 国际化 - DecimalFormatSymbols 类

使用 DecimalFormatSymbols 类,可以更改默认的分隔符符号、分组分隔符符号等。以下示例说明了这一点。

示例

import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;

public class I18NTester {
   public static void main(String[] args) {
      String pattern = "#,###.###";
      double number = 126473.4567;

      DecimalFormat decimalFormat = new DecimalFormat(pattern);

      System.out.println(decimalFormat.format(number));   

      DecimalFormatSymbols decimalFormatSymbols = new DecimalFormatSymbols();
      decimalFormatSymbols.setDecimalSeparator(';');
      decimalFormatSymbols.setGroupingSeparator(':');

      decimalFormat = new DecimalFormat(pattern, decimalFormatSymbols);

      System.out.println(decimalFormat.format(number));
   }
}

输出

它将打印以下结果。

126,473.457
126:473;457

Java 国际化 - 数字分组

使用 DecimalFormat 的 setGroupingSize() 方法,可以更改数字的默认分组。以下示例说明了这一点。

示例

import java.text.DecimalFormat;

public class I18NTester {
   public static void main(String[] args) {
      double number = 121223232473.4567;

      DecimalFormat decimalFormat = new DecimalFormat();

      System.out.println(number);
      System.out.println(decimalFormat.format(number));   

      decimalFormat.setGroupingSize(4);
      System.out.println(decimalFormat.format(number));
	  
   }
}

输出

它将打印以下结果。

1.212232324734567E11
121,223,232,473.457
1212,2323,2473.457

Java 国际化 - DateFormat 类

java.text.DateFormat 类根据区域设置格式化日期。由于不同的国家/地区使用不同的格式显示日期。此类在处理应用程序国际化中的日期方面非常有用。以下示例显示了如何创建和使用 DateFormat 类。

示例

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

public class I18NTester {
   public static void main(String[] args) {
      Locale locale = new Locale("da","DK");

      DateFormat dateFormat = DateFormat.getDateInstance();

      System.out.println(dateFormat.format(new Date()));

      dateFormat = DateFormat.getDateInstance(DateFormat.DEFAULT, locale);

      System.out.println(dateFormat.format(new Date()));
   }
}

输出

它将打印以下结果。

Nov 29, 2017
29-11-2017

Java 国际化 - 日期格式化

DateFormat 类提供各种格式来格式化日期。以下是其中一些格式的列表。

  • DateFormat.DEFAULT

  • DateFormat.SHORT

  • DateFormat.MEDIUM

  • DateFormat.LONG

  • DateFormat.FULL

示例

在以下示例中,我们将展示如何使用不同的格式。

import java.text.DateFormat;
import java.util.Date;

public class I18NTester {
   public static void main(String[] args) {
   
      DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.DEFAULT);

      System.out.println(dateFormat.format(new Date()));

      dateFormat = DateFormat.getDateInstance(DateFormat.SHORT);

      System.out.println(dateFormat.format(new Date()));

      dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM);

      System.out.println(dateFormat.format(new Date()));

      dateFormat = DateFormat.getDateInstance(DateFormat.LONG);

      System.out.println(dateFormat.format(new Date()));

      dateFormat = DateFormat.getDateInstance(DateFormat.FULL);

      System.out.println(dateFormat.format(new Date()));  
  
   }
}

输出

它将打印以下结果。

Nov 29, 2017
11/29/17
Nov 29, 2017
November 29, 2017
Wednesday, November 29, 2017

Java 国际化 - 时间格式化

DateFormat 类提供各种格式来格式化时间。应使用 DateFormat.getTimeInstance() 方法。请参见下面的示例。

示例

在以下示例中,我们将展示如何使用不同的格式来格式化时间。

import java.text.DateFormat;
import java.util.Date;

public class I18NTester {
   public static void main(String[] args) {
   
      DateFormat dateFormat = DateFormat.getTimeInstance(DateFormat.DEFAULT);

      System.out.println(dateFormat.format(new Date()));

      dateFormat = DateFormat.getTimeInstance(DateFormat.SHORT);

      System.out.println(dateFormat.format(new Date()));

      dateFormat = DateFormat.getTimeInstance(DateFormat.MEDIUM);

      System.out.println(dateFormat.format(new Date()));

      dateFormat = DateFormat.getTimeInstance(DateFormat.LONG);

      System.out.println(dateFormat.format(new Date()));

      dateFormat = DateFormat.getTimeInstance(DateFormat.FULL);

      System.out.println(dateFormat.format(new Date()));  
  
   }
}

输出

它将打印以下结果。

4:11:21 PM
4:11 PM
4:11:21 PM
4:11:21 PM IST
4:11:21 PM IST

Java 国际化 - 日期和时间格式化

DateFormat 类提供各种格式来格式化日期和时间。应使用 DateFormat.getDateTimeInstance() 方法。请参见下面的示例。

示例

在以下示例中,我们将展示如何使用不同的格式来格式化日期和时间。

import java.text.DateFormat;
import java.util.Date;

public class I18NTester {
   public static void main(String[] args) {

      DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.DEFAULT);

      System.out.println(dateFormat.format(new Date()));

      dateFormat = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT);

      System.out.println(dateFormat.format(new Date()));

      dateFormat = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM);

      System.out.println(dateFormat.format(new Date()));

      dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);

      System.out.println(dateFormat.format(new Date()));

      dateFormat = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL);

      System.out.println(dateFormat.format(new Date()));
  
   }
}

输出

它将打印以下结果。

Nov 29, 2017 4:16:13 PM
11/29/17 4:16 PM
Nov 29, 2017 4:16:13 PM
November 29, 2017 4:16:13 PM IST
Wednesday, November 29, 2017 4:16:13 PM IST

Java 国际化 - SimpleDateFormat 类

java.text.SimpleDateFormat 类根据给定的模式格式化日期。它还用于从字符串解析日期,其中字符串包含以指定格式表示的日期。请参见以下使用 SimpleDateFormat 类的示例。

示例

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class I18NTester {
   public static void main(String[] args) throws ParseException {
   
      String pattern = "dd-MM-yyyy";

      SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);

      Date date = new Date();

      System.out.println(date);
      System.out.println(simpleDateFormat.format(date));

      String dateText = "29-11-2017";

      date = simpleDateFormat.parse(dateText);

      System.out.println(simpleDateFormat.format(date));
   }
}

输出

它将打印以下结果。

Wed Nov 29 17:01:22 IST 2017
29-11-2017
29-11-2017

Java 国际化 - 基于区域设置的 SimpleDateFormat

区域设置可用于在 SimpleDateFormat 类中基于模式创建特定于区域设置的格式。请参见以下使用特定于区域设置的 SimpleDateFormat 类的示例。

示例

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class I18NTester {
   public static void main(String[] args) throws ParseException {

      Locale locale = new Locale("da", "DK");
      String pattern = "EEEEE MMMMM yyyy";

      SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);

      Date date = new Date();

      System.out.println(date);
      System.out.println(simpleDateFormat.format(date));

      simpleDateFormat = new SimpleDateFormat(pattern,locale);

      System.out.println(simpleDateFormat.format(date));
   }
}

输出

它将打印以下结果。

Wed Nov 29 17:48:14 IST 2017
Wednesday November 2017
onsdag november 2017

Java 国际化 - DecimalFormatSymbols 类

使用 DecimalFormatSymbols 类,可以更改默认的分隔符符号、分组分隔符符号等。以下示例说明了这一点。

示例

import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;

public class I18NTester {
   public static void main(String[] args) {
      String pattern = "#,###.###";
      double number = 126473.4567;

      DecimalFormat decimalFormat = new DecimalFormat(pattern);

      System.out.println(decimalFormat.format(number));   

      DecimalFormatSymbols decimalFormatSymbols = new DecimalFormatSymbols();
      decimalFormatSymbols.setDecimalSeparator(';');
      decimalFormatSymbols.setGroupingSeparator(':');

      decimalFormat = new DecimalFormat(pattern, decimalFormatSymbols);

      System.out.println(decimalFormat.format(number));
   }
}

输出

它将打印以下结果。

126,473.457
126:473;457

Java 国际化 - 日期格式模式

以下是日期格式模式中字符的用法。

序号类和描述
1

G

显示纪元。

2

y

显示年份。有效值为 yy、yyyy。

3

M

显示月份。有效值为 MM、MMM 或 MMMMM。

4

d

显示月份中的日期。有效值为 d、dd。

5

h

显示一天中的小时(1-12 AM/PM)。有效值为 hh。

6

H

显示一天中的小时(0-23)。有效值为 HH。

7

m

显示小时中的分钟(0-59)。有效值为 mm。

8

s

显示分钟中的秒(0-59)。有效值为 ss。

9

S

显示分钟中的毫秒(0-999)。有效值为 SSS。

10

E

显示一周中的日期(例如星期一、星期二等)。

11

D

显示一年中的日期(1-366)。

12

F

显示一个月中的星期几(例如 12 月的第一个星期四)。

13

w

显示一年中的星期(1-53)。

14

W

显示一个月中的星期(0-5)

15

a

显示 AM/PM

16

k

显示一天中的小时(1-24)。

17

K

显示一天中的小时,AM/PM(0-11)。

18

z

显示时区。

示例

在本例中,我们将根据不同的模式格式化日期。

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class I18NTester {
   public static void main(String[] args) throws ParseException {

      String pattern = "dd-MM-yy";
      SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
      Date date = new Date();
      System.out.println(simpleDateFormat.format(date));

      pattern = "MM-dd-yyyy";
      simpleDateFormat = new SimpleDateFormat(pattern);
      System.out.println(simpleDateFormat.format(date));

      pattern = "yyyy-MM-dd HH:mm:ss";
      simpleDateFormat = new SimpleDateFormat(pattern);
      System.out.println(simpleDateFormat.format(date));

      pattern = "EEEEE MMMMM yyyy HH:mm:ss.SSSZ";
      simpleDateFormat = new SimpleDateFormat(pattern);
      System.out.println(simpleDateFormat.format(date));
}
}

输出

它将打印以下结果。

29-11-17
11-29-2017
2017-11-29 18:47:42
Wednesday November 2017 18:47:42.787+0530

Java 国际化 - UTC

UTC 代表协调世界时。它是一种时间标准,在全球范围内普遍使用。所有时区都是相对于 UTC 作为偏移量计算的。例如,丹麦哥本哈根的时间为 UTC + 1,表示 UTC 时间加一小时。它独立于夏令时,应用于在数据库中存储日期和时间。

时区转换

以下示例将展示各种时区的转换。我们将打印一天中的小时和以毫秒为单位的时间。第一个将变化,第二个将保持不变。

示例

import java.text.ParseException;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.TimeZone;

public class I18NTester {
   public static void main(String[] args) throws ParseException {
   
      Calendar date = new GregorianCalendar();

      date.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));
      date.set(Calendar.HOUR_OF_DAY, 12);

      System.out.println("UTC: " + date.get(Calendar.HOUR_OF_DAY));
      System.out.println("UTC: " + date.getTimeInMillis());

      date.setTimeZone(TimeZone.getTimeZone("Europe/Copenhagen"));
      System.out.println("CPH: " + date.get(Calendar.HOUR_OF_DAY));
      System.out.println("CPH: " + date.getTimeInMillis());

      date.setTimeZone(TimeZone.getTimeZone("America/New_York"));
      System.out.println("NYC: " + date.get(Calendar.HOUR_OF_DAY));
      System.out.println("NYC: " + date.getTimeInMillis());
   }
}

输出

它将打印以下结果。

UTC: 12
UTC: 1511956997540
CPH: 13
CPH: 1511956997540
NYC: 7
NYC: 1511956997540

可用的时区

以下示例将展示系统可用的时区。

示例

import java.text.ParseException;
import java.util.TimeZone;

public class I18NTester {
   public static void main(String[] args) throws ParseException {
      String[] availableIDs = TimeZone.getAvailableIDs();

      for(String id : availableIDs) {
         System.out.println("Timezone = " + id);
      }
   }
}

输出

它将打印以下结果。

Timezone = Africa/Abidjan
Timezone = Africa/Accra
...
Timezone = VST

Java 国际化 - Unicode 字符串转换

在 Java 中,文本在内部以 Unicode 格式存储。如果输入/输出采用不同的格式,则需要进行转换。

转换

以下示例将展示如何将 Unicode 字符串转换为 UTF8 字节数组以及如何将 UTF8 字节数组转换为 Unicode 字节数组。

示例

import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.text.ParseException;

public class I18NTester {
   public static void main(String[] args) throws ParseException, UnsupportedEncodingException {

      String unicodeString = "\u00C6\u00D8\u00C5" ;

      //convert Unicode to UTF8 format
      byte[] utf8Bytes = unicodeString.getBytes(Charset.forName("UTF-8"));
      printBytes(utf8Bytes, "UTF 8 Bytes");

      //convert UTF8 format to Unicode
      String converted = new String(utf8Bytes, "UTF8");
      byte[] unicodeBytes = converted.getBytes();
      printBytes(unicodeBytes, "Unicode Bytes");
   }

   public static void printBytes(byte[] array, String name) {
      for (int k = 0; k < array.length; k++) {
         System.out.println(name + "[" + k + "] = " + array[k]);
          
      }
   }
}

输出

它将打印以下结果。

UTF 8 Bytes[0] = -61
UTF 8 Bytes[1] = -122
UTF 8 Bytes[2] = -61
UTF 8 Bytes[3] = -104
UTF 8 Bytes[4] = -61
UTF 8 Bytes[5] = -123
Unicode Bytes[0] = -58
Unicode Bytes[1] = -40
Unicode Bytes[2] = -59

Java 国际化 - Unicode Reader/Writer 转换

Reader 和 Writer 类是面向字符的流类。这些类可用于读取和转换 Unicode 字符。

转换

以下示例将展示如何使用 Reader 和 Writer 类将 Unicode 字符串转换为 UTF8 字节数组以及如何将 UTF8 字节数组转换为 Unicode 字节数组。

示例

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
import java.nio.charset.Charset;
import java.text.ParseException;

public class I18NTester {
   public static void main(String[] args) throws ParseException, IOException {

      String input = "This is a sample text" ;

      InputStream inputStream = new ByteArrayInputStream(input.getBytes());

      //get the UTF-8 data
      Reader reader = new InputStreamReader(inputStream, Charset.forName("UTF-8"));

      //convert UTF-8 to Unicode
      int data = reader.read();
      while(data != -1){
         char theChar = (char) data;
         System.out.print(theChar);
         data = reader.read();
      }
      reader.close();

      System.out.println();

      //Convert Unicode to UTF-8 Bytes
      ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
      Writer writer = new OutputStreamWriter(outputStream, Charset.forName("UTF-8"));

      writer.write(input);
      writer.close();

      String out = new String(outputStream.toByteArray());
   
      System.out.println(out);
   }  
}

输出

它将打印以下结果。

This is a sample text
This is a sample text
广告

© . All rights reserved.