Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
通过调用 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-UK 语言环境:
示例 InternationalizedMortgageCalculator.java
需要以下资源文件:
Currency
类包含获取货币相关信息的其他方法:
getAvailableCurrencies
:返回 JDK 中的所有可用货币
getCurrencyCode
:返回 Currency
实例的 ISO 4217 数字代码
getSymbol
:返回 Currency
实例的符号。你可以选择将 Locale
对象指定为参数。请考虑以下片段:
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
此片段表明货币符号可能因语言环境而异。
getDisplayName
:返回 Currency
实例的显示名称。与 getSymbol
方法类似,你可以选择指定 Locale
对象。
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