使用 预定义格式

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

Numbers

您可以使用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 值的数字值。有关更多信息,请参见将拉丁数字转换为其他 Unicode 数字

此外,某些语言环境的变体代码指定使用 Unicode 数字形状代替阿拉伯数字,例如泰语的语言环境。有关更多信息,请参见创建语言环境中的Variant Code部分。

Currencies

如果要编写业务应用程序,则可能需要格式化和显示货币。除了调用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类的设计 Object 是使任何给定的货币最多只能有一个Currency实例。因此,没有公共构造函数。如前面的代码示例所示,您将使用getInstance方法获得Currency实例。

samplesInternationalizedMortgageCalculator.java还演示了如何使用Currency类。 (请注意,此示例不会转换货币值.)以下使用美国英语语言环境:

按揭计算机,美国语言环境

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

房贷计算器,英语(英国)语言环境

samplesInternationalizedMortgageCalculator.java需要以下资源文件:

Currency类包含其他方法来检索与货币相关的信息:

Locale enGBLocale = 
    new Locale.Builder().setLanguage("en").setRegion("GB").build();

Locale enUSLocale =
    new Locale.Builder().setLanguage("en").setRegion("US").build();

Currency currencyInstance = Currency.getInstance(enUSLocale);

System.out.println(
    "Symbol for US Dollar, en-US locale: " +
    currencyInstance.getSymbol(enUSLocale));

System.out.println(
    "Symbol for US Dollar, en-UK locale: " +
    currencyInstance.getSymbol(enGBLocale));

摘录打印以下内容:

Symbol for US Dollar, en-US locale: $
Symbol for US Dollar, en-UK locale: USD

此摘录演示了货币符号可以根据区域设置而变化。

对 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

Percentages

您也可以使用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