这些Java教程是针对JDK 8编写的。本页中描述的示例和实践不利用后续版本中引入的改进,并且可能使用不再可用的技术。
有关Java SE 9和后续版本中更新的语言功能的摘要,请参阅Java语言变更。
有关所有JDK版本的新功能、增强功能以及已删除或弃用选项的信息,请参阅JDK发行说明。
通过调用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值在内部表示的数字值。有关更多信息,请参见将拉丁数字转换为其他Unicode数字。
此外,一些语言环境具有指定使用Unicode数字形式代替阿拉伯数字的变体代码,例如泰语的语言环境。有关更多信息,请参见变体代码部分的创建语言环境。
如果您正在编写商业应用程序,可能需要格式化和显示货币。您可以以与数字相同的方式格式化货币,只是调用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)); }
上述代码生成的输出如下:
法国(法国),欧元:9 876 543,21 € 德国(德国),欧元:9.876.543,21 € 英语(美国),美元:$9,876,543.21
乍一看,这个输出可能看起来不对,因为数字值都是相同的。当然,9 876 543,21 €并不等于$9,876,543.21。然而,请记住,NumberFormat
类不知道汇率。属于NumberFormat
类的方法格式化货币,但不进行转换。
请注意,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货币值组成:字母代码、数字代码和小数位。以井号(#
)开头的任何行都被视为注释行。例如:
# 加拿大的示例货币属性 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