Java I18n 简明教程

Java Internationalization - Quick Guide

Java Internationalization - Overview

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

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

Localization

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

为了实现本地化,Java 应用程序应实现国际化。

Culturally Dependent Information

以下信息项通常随不同时区或文化而变化。

  1. Messages

  2. Date

  3. Time

  4. Number

  5. Currency

  6. Measurements

  7. Phone Numbers

  8. Postal Addresses

  9. GUI labels

Internationalization Classes

Java 有一组内置类可帮助应用程序实现国际化。这些类如下所示:

Sr.No.

Class & Description

1

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

2

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

3

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

4

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

5

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

6

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

Java Internationalization - Environment Setup

在本章,我们将讨论为 Java 设置宜人环境的事物的不同方面。

Local Environment Setup

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

Java SE 可以通过链接 Download Java 免费获得。您可以根据您的操作系统下载一个版本。

按照说明下载 Java 并运行 .exe 以在您的机器上安装 Java。一旦您在您的机器上安装了 Java,您将需要设置环境变量来指向正确的安装目录 −

Setting Up the Path for Windows

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

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

  2. 点击“高级”标签下的“环境变量”按钮。

  3. 现在,更改“路径”变量,使其也包含指向 Java 可执行文件的路径。例如,如果路径目前设置为“C:\WINDOWS\SYSTEM32”,那么将您的路径更改为“C:\WINDOWS\SYSTEM32;c:\Program Files\java\jdk\bin”。

Setting Up the Path for Linux, UNIX, Solaris, FreeBSD

应该设置环境变量 PATH 以指向已安装 Java 二进制文件的位置。如果您遇到困难,请参阅您的 shell 文档。

例如,如果您使用 bash 作为您的 shell,那么您将向 '.bashrc 的尾部添加以下行: export PATH = /path/to/java:$PATH'

要编写 Java 程序,您将需要一个文本编辑器。市场上有更复杂的 IDE。但现在,您可以考虑以下内容之一 −

  1. Notepad − 在 Windows 机器上,您可以使用任何简单的文本编辑器,如记事本(推荐用于本教程)、TextPad。

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

  3. Eclipse − 一个由 Eclipse 开源社区开发的 Java IDE,可从 https://www.eclipse.org/ 下载。

What is Next?

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

Java Internationalization - Locale Class

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

Locale Contents

Locale 对象包含以下内容:

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

  2. Script - ISO 15924 alpha-4 脚本代码。脚本字段不区分大小写,但 Locale 始终规范化为首字母大写。

  3. Country (region) - ISO 3166 alpha-2 国家代码或 UN M.49 数字 3 区域代码。国家字段不区分大小写,但 Locale 始终规范化为大写。

  4. Variant - 用于指示 Locale 变化的任何任意值。如果存在两个或更多个指示其自身语义的变体值,则应按重要性对这些值进行排序,最重要的值排在最前面,并用下划线 (“_”) 分隔。变体字段区分大小写。

  5. Extensions ——表示语言识别之外的扩展的一个映射,它来自单一字符键到字符串值。Locale 中的扩展实现 BCP 47 扩展子标记和专用子标记的语义和语法。扩展不区分大小写,但 Locale 会将所有扩展键和值规范化为小写。

Java Internationalization - Example - Locale Details

在此示例中,我们将获取默认语言环境并打印其详细信息。然后为“fr”创建语言环境并打印其详细信息。

Example

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());
   }
}

Output

它将打印以下结果。

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 Internationalization - Example - Display Language

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

Example

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));
   }
}

Output

它将打印以下结果。

English
anglais
inglés

Java Internationalization - ResourceBundle Class

ResourceBundle 类用于存储与语言环境相关的文本和对象。我们通常使用属性文件来存储特定语言环境的文本并使用 ResourceBundle 对象来表示它们。以下是 Java 中基于应用程序使用特定语言环境的属性文件的步骤。

Step 1: Create Properties Files.

假设我们需要英语语言环境的属性文件。然后创建一个属性文件名称为 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!

在这里你可以发现键是相同的,但值在两个属性文件中属于特定语言环境。

Step 2: Create ResourceBundle Object

使用属性文件名称和语言环境通过以下语法创建 ResourceBundle 对象。

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

Step 3: Get the Value from ResourceBundle Object

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

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

Example

以下示例说明如何使用 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!

Notes for Naming Conventions

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

  1. 对于映射到默认语言环境的属性文件,无需任何前缀。message_en_US.properties 等效于 message.properties。

  2. 对于映射到语言环境的属性文件,可以用两种方式附加前缀。message_fr.properties 等效于 message_fr_FR.properties。

Java Internationalization - NumberFormat Class

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

Example - Format Numbers

在此示例中,我们根据美国语言环境和丹麦语言环境格式化数字。

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));
   }
}

Output

它将打印以下结果。

100,76
100.76

Java Internationalization - Format Currencies

Example

在此示例中,我们将根据美国语言环境和丹麦语言环境格式化货币。

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));
   }
}

Output

它将打印以下结果。

kr 100,76
$100.76

Java Internationalization - Format Percentages

Example

在此示例中,我们按百分比格式设置数字。

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));
   }
}

Output

它将打印以下结果。

76%

Java Internationalization - Set Min/Max Precision

Example

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

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));
   }
}

Output

它将打印以下结果。

234.763

Java Internationalization - Set Rounding Mode

Example

在此示例中,我们展示了舍入模式。

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));
   }
}

Output

它将打印以下结果。

100
99

Java Internationalization - Parsing Numbers

Example

在此示例中,我们展示了在不同语言环境中出现的数字的解析。

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"));
   }
}

Output

它将打印以下结果。

100.76
10076

Java Internationalization - DecimalFormat Class

java.text.DecimalFormat 类用于按照自定义格式和区域设置对数字进行格式化。

Example - Format Numbers

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

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));
   }
}

Output

它将打印以下结果。

1.23456789123E8
1,2345,6789.12

Java Internationalization - Format Patterns

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

Sr.No.

Class & Description

1

0 如果存在的位数不够,则显示 0。

2

# 显示数字,省略前导零。

3

. Decimal separator.

4

, Grouping separator.

5

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

6

; Format separator.

7

- Negative number prefix.

8

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

9

? 以千分比显示数字,乘以 1000 后显示。

10

X 用于将字符标记为数字的前缀/后缀。

11

' 用于标记特殊字符周围的引号。

Example

在此示例中,我们会按照不同的模式对数字进行格式化。

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));
   }
}

Output

它将打印以下结果。

1.23456789123E8
1,2345,6789.12

Java Internationalization - Locale Specific DecimalFormat

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

Example

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));
   }
}

Output

它将打印以下结果。

123.45
123,45

Java Internationalization - DecimalFormatSymbols Class

使用 DecimalFormatSymbols 类,可以更改默认分隔符符号、分组分隔符符号等。以下示例对此进行了说明。

Example

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));
   }
}

Output

它将打印以下结果。

126,473.457
126:473;457

Java Internationalization - Grouping Digits

使用 DecimalFormat 的 setGroupingSize() 方法,可以更改数字的默认分组。以下示例对此进行了说明。

Example

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));

   }
}

Output

它将打印以下结果。

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

Java Internationalization - DateFormat Class

java.text.DateFormat 类根据语言环境格式化日期。由于不同的国家使用不同的格式显示日期。该类在处理应用程序的国际化中的日期时非常有用。以下示例展示了如何创建和使用 DateFormat 类。

Example

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()));
   }
}

Output

它将打印以下结果。

Nov 29, 2017
29-11-2017

Java Internationalization - Formatting Dates

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

  1. DateFormat.DEFAULT

  2. DateFormat.SHORT

  3. DateFormat.MEDIUM

  4. DateFormat.LONG

  5. DateFormat.FULL

Example

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

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()));

   }
}

Output

它将打印以下结果。

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

Java Internationalization - Formatting Time

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

Example

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

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()));

   }
}

Output

它将打印以下结果。

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

Java Internationalization - Formatting Date and Time

DateFormat 类通过提供各种格式,将日期和时间组合起来进行格式化。须使用 DateFormat.getDateTimeInstance() 方法。请参见下面的示例。

Example

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

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()));

   }
}

Output

它将打印以下结果。

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 Internationalization - SimpleDateFormat Class

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

Example

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));
   }
}

Output

它将打印以下结果。

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

Java Internationalization - Locale specific SimpleDateFormat

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

Example

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));
   }
}

Output

它将打印以下结果。

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

Java Internationalization - DecimalFormatSymbols Class

使用 DecimalFormatSymbols 类,可以更改默认分隔符符号、分组分隔符符号等。以下示例对此进行了说明。

Example

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));
   }
}

Output

它将打印以下结果。

126,473.457
126:473;457

Java Internationalization - Date Format Patterns

以下是字符在日期格式化模式中的用途。

Sr.No.

Class & Description

1

G To display Era.

2

y 用于显示年份。有效值 yy、yyyy。

3

M 用于显示月份。有效值 MM、MMM 或 MMMMM。

4

d 用于显示当月的日期。有效值 d、dd。

5

h 用于显示一天中的小时(上午/下午 1-12)。有效值 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 To display Time Zone.

Example

在这个示例中,我们根据不同的模式设置日期的格式。

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));
}
}

Output

它将打印以下结果。

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

Java Internationalization - UTC

UTC 代表协调世界时。它是时间标准,在世界各地普遍使用。所有时区都与 UTC 进行比较计算,作为偏移量。例如,丹麦哥本哈根的时间是 UTC + 1,表示 UTC 时间加一小时。它与夏令时无关,应该用于在数据库中存储日期和时间。

Conversion of time zones

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

Example

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

Available Time Zones

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

Example

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 Internationalization - Unicode Conversion from/to String

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

Conversion

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

Example

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 Internationalization - Unicode Conversion from/to Reader/Writer

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

Conversion

以下示例将展示如何使用读取器和写入器类将 Unicode 字符串转换为 UTF8 字节数组,将 UTF8 字节数组转换为 Unicode 字节数组。

Example

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