目录

Java I18N - 快速指南

Java Internalization - Overview

内化 (Internalization)

内部化或I18N指的是能够以多种语言和不同语言服务用户的应用程序的能力。 Java内置了内置支持。 Java还相应地提供数字,货币的形成以及日期和时间的调整。

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

本地化(Localization)

本地化或L10N是应用程​​序的自适应性,它是应用程序如何使用特定语言,数字格式,日期和时间设置等进行自适应的。

java应用程序应该国际化,以便能够本地化。

文化依赖信息

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

  • Messages

  • Date

  • Time

  • Number

  • Currency

  • Measurements

  • 电话号码

  • 邮政地址

  • GUI标签

国际化课程

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

Sr.No. 类和描述
1

Locale

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

2

ResourceBundle

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

3

NumberFormat

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

4

DecimalFormat

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

5

DateFormat

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

6

SimpleDateFormat

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

Java Internalization - Environment Setup

在本章中,我们将讨论为Java建立适宜环境的不同方面。

本地环境设置 (Local Environment Setup)

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

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

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

设置Windows的路径

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

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

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

  • 现在,更改'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编辑器 (Popular Java Editors)

要编写Java程序,您需要一个文本编辑器。 市场上还有更复杂的IDE。 但就目前而言,您可以考虑以下其中一项 -

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

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

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

接下来是什么 (What is Next?)

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

Java Internalization - Locale Class

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

区域设置内容

Locale对象包含以下内容:

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

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

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

  • Variant - 用于指示区域设置变体的任意值。 如果有两个或多个变量值,每个变量值都指示其自己的语义,则这些值应按重要性排序,最重要的是,首先用下划线('_')分隔。 变体字段区分大小写。

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

Java Internalization - Example - Locale Details

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

I18NTester.java

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

在这个例子中,我们将每个语言环境的显示语言作为参数传递。

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

输出 (Output)

它将打印以下结果。

English
anglais
inglés

Java Internalization - ResourceBundle Class

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

第1步:创建属性文件。

假设我们需要英语语言环境的属性文件。 然后创建属性文件名XXX_en_US.properties,其中XXX是文件的名称,en_US表示英语(美国)的语言环境。

Messages_en_US.properties

message=Welcome to iowiki.com!

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

Messages_fr_FR.properties

message=Bienvenue sur iowiki.com!

在这里,您可以确定密钥是相同的,但值在属性文件中是特定于区域设置的。

第2步:创建ResourceBundle对象

使用以下语法创建具有属性文件名和语言环境的ResourceBundle对象。

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

第3步:从ResourceBundle对象获取值。

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

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

例子 (Example)

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

IOTester.java

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

输出 (Output)

它将打印以下结果。

Message in en_US: Welcome to iowiki.com!
Message in fr_FR: Bienvenue sur iowiki.com!

命名约定注释

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

  • 对于映射到默认语言环境的属性文件,不需要前缀。 message_en_US.properties等同于message.properties。

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

Java Internalization - NumberFormat Class

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

示例 - 格式编号

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

IOTester.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.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 Internalization - Format Currencies

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

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

输出 (Output)

它将打印以下结果。

kr 100,76
$100.76

Java Internalization - Format Percentages

在此示例中,我们以百分比格式格式化数字。

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

输出 (Output)

它将打印以下结果。

76%

Java Internalization - Set Min/Max Precision

在这个例子中,我们设置整数的最小和最大数字以及数字的小数部分。

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

输出 (Output)

它将打印以下结果。

234.763

Java Internalization - Set Rounding Mode

在这个例子中,我们展示了舍入模式。

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

输出 (Output)

它将打印以下结果。

100
99

Java Internalization - Parsing Numbers

在这个例子中,我们展示了对不同语言环境中存在的数字的解析。

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

输出 (Output)

它将打印以下结果。

100.76
10076

Java Internalization - DecimalFormat Class

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

示例 - 格式编号

在这个例子中,我们根据给定的模式格式化数字。

IOTester.java

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 Internalization - Format Patterns

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

Sr.No. 类和描述
1

0

如果存在较少的数字则显示0。

2

#

显示数字省略前导零。

3

.

小数分隔符。

4

,

分组分隔符。

5

E

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

6

;

格式分隔符。

7

-

负数前缀。

8

%

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

9

?

在乘以1000后将数字显示为mille。

10

X

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

11

'

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

在此示例中,我们基于不同的模式格式化数字。

IOTester.java

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 Internalization - Locale Specific DecimalFormat

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

IOTester.java

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 Internalization - DecimalFormatSymbols Class

使用DecimalFormatSymbols类,可以更改默认分隔符号,分组分隔符号等。 以下示例说明了相同的内容。

IOTester.java

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 Internalization - Grouping Digits

使用DecimalFormat的setGroupingSize()方法,可以更改默认的数字分组。 以下示例说明了相同的内容。

IOTester.java

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 Internalization - DateFormat Class

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

IOTester.java

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 Internalization - Formatting Dates

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

  • DateFormat.DEFAULT

  • DateFormat.SHORT

  • DateFormat.MEDIUM

  • DateFormat.LONG

  • DateFormat.FULL

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

IOTester.java

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 Internalization - Formatting Time

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

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

IOTester.java

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 Internalization - Formatting Date and Time

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

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

IOTester.java

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

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

IOTester.java

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 Internalization - Locale specific SimpleDateFormat

Locale可用于在SimpleDateFormat类中的模式上创建特定于语言环境的格式。 请参阅以下使用特定于语言环境的SimpleDateFormat类的示例。

IOTester.java

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 Internalization - DecimalFormatSymbols Class

使用DecimalFormatSymbols类,可以更改默认分隔符号,分组分隔符号等。 以下示例说明了相同的内容。

IOTester.java

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 Internalization - Date Format Patterns

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

Sr.No. 类和描述
1

G

要显示时代。

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月的第1个星期四)。

13

w

显示年中的周(1-53)。

14

W

显示每月的周数(0-5)

15

a

显示AM/PM

16

k

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

17

K

显示小时,上午/下午(0-11)。

18

z

显示时区。

在此示例中,我们基于不同的模式格式化日期。

IOTester.java

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 Internalization - UTC

UTC代表协调世界时。 它是时间标准,并且在世界各地普遍使用。 所有时区都与UTC相比计算为偏移量。 例如,丹麦哥本哈根的时间是UTC + 1表示UTC时间加一小时。 它独立于Day light节省,应该用于在数据库中存储日期和时间。

转换时区

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

IOTester.java

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

输出 (Output)

它将打印以下结果。

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

可用时区

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

IOTester.java

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

输出 (Output)

它将打印以下结果。

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

Java Internalization - Unicode Conversion from/to String

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

转换 (Conversion)

下面的示例将展示Unicode字符串到UTF8 byte []和UTF8 byte []到Unicode byte []的转换。

IOTester.java

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

输出 (Output)

它将打印以下结果。

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

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

转换 (Conversion)

下面的示例将展示使用Reader和Writer类将Unicode字符串转换为UTF8 byte []和UTF8 byte []到Unicode byte []。

IOTester.java

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

输出 (Output)

它将打印以下结果。

This is a sample text
This is a sample text
↑回到顶部↑
WIKI教程 @2018