文档

Java™ 教程-Java Tutorials 中文版
使用预定义格式
Trail: Internationalization
Lesson: Formatting
Section: Numbers and Currencies

使用预定义格式

通过调用 NumberFormat 类提供的方法,你可以根据 Locale 格式化数字,货币和百分比。下面的材料演示了一个名为 NumberFormatDemo.java 的示例程序的格式化技术。

数字

你可以使用 NumberFormat 方法来格式化基本类型数字,例如 double,以及它们相应的包装器对象,例如 Double

以下代码示例根据 Locale 格式化 Double。调用 getNumberInstance 方法返回特定于语言环境的 NumberFormat 的实例。format 方法接受 Double 作为参数,并在 String 中返回格式化的数字。

static public void displayNumber(Locale currentLocale) {

    Integer quantity = new Integer(123456);
    Double amount = new Double(345987.246);
    NumberFormat numberFormatter;
    String quantityOut;
    String amountOut;

    numberFormatter = NumberFormat.getNumberInstance(currentLocale);
    quantityOut = numberFormatter.format(quantity);
    amountOut = numberFormatter.format(amount);
    System.out.println(quantityOut + "   " + currentLocale.toString());
    System.out.println(amountOut + "   " + currentLocale.toString());
}

此示例打印以下内容;它显示了相同数字的格式如何随 Locale 而变化:

123 456   fr_FR
345 987,246   fr_FR
123.456   de_DE
345.987,246   de_DE
123,456   en_US
345,987.246   en_US

使用阿拉伯数字以外的数字形状

默认情况下,当文本包含数字值时,将使用阿拉伯数字显示这些值。如果首选其他 Unicode 数字形状,请使用 java.awt.font.NumericShaper 类。NumericShaper API 使你可以显示数值,其在内部表示为任何 Unicode 数字形状的 ASCII 值。有关详细信息,请参阅 Converting Latin Digits to Other Unicode Digits

此外,某些语言环境具有变体代码,这些代码指定使用 Unicode 数字形状代替阿拉伯数字,例如泰语的语言环境。有关详细信息,请参阅 Creating a Locale 中的 Variant Code 部分。

货币

如果你正在编写商业应用程序,则可能需要格式化和显示货币。你可以使用与数字相同的方式格式化货币,除了你调用 getCurrencyInstance 来创建格式化程序。当你调用 format 方法时,它会返回 String,其中包含格式化的数字和相应的货币符号。

此代码示例演示如何以特定于语言环境的方式格式化货币:

static public void displayCurrency( Locale currentLocale) {

    Double currencyAmount = new Double(9876543.21);
    Currency currentCurrency = Currency.getInstance(currentLocale);
    NumberFormat currencyFormatter = 
        NumberFormat.getCurrencyInstance(currentLocale);

    System.out.println(
        currentLocale.getDisplayName() + ", " +
        currentCurrency.getDisplayName() + ": " +
        currencyFormatter.format(currencyAmount));
}

前面几行代码生成的输出如下:

French (France), Euro: 9 876 543,21 €
German (Germany), Euro: 9.876.543,21 €
English (United States), US Dollar: $9,876,543.21

乍一看,这个输出可能看起来不对,因为数值都是一样的。当然,9 876 543,21 € 不等于 $9,876,543.21。但是,请记住 NumberFormat 类不知道汇率。属于 NumberFormat 类的方法会对货币进行格式化,但不会转换它们。

请注意,Currency 类的设计使得任何给定货币永远不会有多个 Currency 实例。因此,没有公共构造函数。如前面的代码示例所示,你使用 getInstance 方法获取 Currency 实例。

示例 InternationalizedMortgageCalculator.java 还演示了如何使用 Currency 类。(请注意,此示例不转换货币值。)以下使用 en-US 语言环境:

按揭计算器,en-US 语言环境

以下使用 en-UK 语言环境:

按揭计算器,en-UK 语言环境

示例 InternationalizedMortgageCalculator.java 需要以下资源文件:

Currency 类包含获取货币相关信息的其他方法:

对 ISO 4217 货币代码的可扩展支持

ISO 4217是国际标准组织发布的标准。它指定三个字母的代码(和等效的三位数字代码)来表示货币和资金。该标准由外部机构维护,独立于 Java SE 平台发布。

假设一个国家采用不同的货币,ISO 4217 维护机构发布货币更新。要实现此更新,从而在运行时取代默认货币,请创建名为 <JAVA_HOME>/lib/currency.properties 的属性文件。此文件包含 ISO 3166 国家/地区代码的键/值对以及 ISO 4217 货币数据。值部分由三个以逗号分隔的 ISO 4217 货币值组成:字母代码,数字代码和次要单元。以井号(#)开头的任何行都被视为注释行。例如:

# Sample currency property for Canada
CA=CAD,124,2

CAD 代表加元;124 是加元的数字代码;和 2 是次要单位,是货币表示小数货币所需的小数位数。例如,以下属性文件将默认加拿大货币取代为没有任何小于美元的单位的加元:

CA=CAD,124,0

百分比

你还可以使用 NumberFormat 类的方法来设置百分比格式。要获取特定于语言环境的格式化程序,请调用 getPercentInstance 方法。使用此格式化程序,小数部分(例如 0.75)显示为 75%。

以下代码示例显示如何格式化百分比。

static public void displayPercent(Locale currentLocale) {

    Double percent = new Double(0.75);
    NumberFormat percentFormatter;
    String percentOut;

    percentFormatter = NumberFormat.getPercentInstance(currentLocale);
    percentOut = percentFormatter.format(percent);
    System.out.println(percentOut + "   " + currentLocale.toString());
}

此示例打印以下内容:

75 %   fr_FR
75%   de_DE
75%   en_US

Previous page: Numbers and Currencies
Next page: Customizing Formats