版本
|
修改历史
|
作者
|
描述
|
开发时间(h)
|
0.1
|
2007-8-12
|
LevinSoft
|
创建文档得基本结构、基本流程
|
1
|
DecimalFormat
是
NumberFormat
的一个具体子类,用于格式化十进制数字。该类设计有各种功能,使其能够分析和格式化任意语言环境中的数,包括对西方语言、阿拉伯语和印度语数字的支持。它还支持不同类型的数,包括整数 (123)、定点数 (123.4)、科学记数法表示的数 (1.23E4)、百分数 (12%) 和金额 ($123)。所有这些内容都可以本地化。
NumberFormat
(包括默认语言环境),可调用
NumberFormat
的某个工厂方法,如
getInstance()
。通常不直接调用
DecimalFormat
的构造方法,因为
NumberFormat
的工厂方法可能返回不同于
DecimalFormat
的子类。如果需要自定义格式对象,可执行:
NumberFormat f = NumberFormat.getInstance(loc);
if (f instanceof DecimalFormat) {
((DecimalFormat) f).setDecimalSeparatorAlwaysShown(true);
}
DecimalFormat
包含一个
模式 和一组
符号。可直接使用
applyPattern()
或间接使用 API 方法来设置模式。符号存储在
DecimalFormatSymbols
对象中。使用
NumberFormat
工厂方法时,可从已本地化的
ResourceBundle
中读取模式和符号。
DecimalFormat
模式包含正数和负数子模式,例如
"#,##0.00;(#,##0.00)"
。每个子模式都有前缀、数字部分和后缀。负数子模式是可选的;如果存在,则将用已本地化的减号(在多数语言环境中是
'-'
)作为前缀的正数子模式用作负数子模式。也就是说,单独的
"0.00"
等效于
"0.00;-0.00"
。如果存在显式的负数子模式,则它仅指定负数前缀和后缀;数字位数、最小位数,其他特征都与正数模式相同。这意味着
"#,##0.0#;(#)"
的行为与
"#,##0.0#;(#,##0.0#)"
完全相同。
"#,##,###,####"
==
"######,####"
==
"##,####,####"
。
DecimalFormatSymbols
对象中获得的相应字符,这些字符已失去其特殊状态。两种例外是货币符号和引号,不将其本地化。
符号
|
位置
|
本地化?
|
含义
|
0
|
数字
|
是
|
阿拉伯数字
|
#
|
数字字
|
是
|
阿拉伯数字,如果不存在则显示为空
|
.
|
数字
|
是
|
小数分隔符或货币小数分隔符
|
-
|
数字
|
是
|
减号
|
,
|
数字
|
是
|
分组分隔符
|
E
|
数字
|
是
|
分隔科学计数法中的尾数和指数。
在前缀或后缀中无需加引号。
|
;
|
子模式边界
|
是
|
分隔正数和负数子模式
|
%
|
前缀或后缀
|
是
|
乘以 100 并显示为百分数
|
/u2030
|
前缀或后缀
|
是
|
乘以 1000 并显示为千分数
|
¤ (
/u00A4 )
|
前缀或后缀
|
否
|
货币记号,由货币符号替换。如果两个同时出现,则用国际货币符号替换。如果出现在某个模式中,则使用货币小数分隔符,而不使用小数分隔符。
|
'
|
前缀或后缀
|
否
|
用于在前缀或或后缀中为特殊字符加引号,例如
"'#'#" 将 123 格式化为
"#123" 。要创建单引号本身,请连续使用两个单引号:
"# o''clock" 。
|
DecimalFormat
仅通过某个模式 来格式化和分析科学计数法表示的数;目前没有创建科学计数法格式的工厂方法。在这个模式中,指数字符后面紧跟着一个或多个数字字符即指示科学计数法。示例:
"0.###E0"
将数字 1234 格式化为
"1.234E3"
。
"0.###E0 m/s"
等此类的模式。 "##0.#####E0"
。使用此模式时,数 12345 格式化为 "12.345E3"
,123456 则格式化为 "123.456E3"
。 "00.###E0"
格式化 0.00123 时得到 "12.3E-4"
。 "##0.##E0"
格式化 12345 得到 "12.3E3"
。要显示所有位数,请将有效位数计数设置为零。有效位数不会影响分析。 DecimalFormat
使用 half-even 舍入(请参阅
ROUND_HALF_EVEN)进行格式化。
DecimalFormat
使用
DecimalFormatSymbols
对象中所定义的、从已本地化的阿拉伯数字 0 开始的 10 个连续字符作为阿拉伯数字。为了进行分析,可识别
Character.digit所定义的这些阿拉伯数字和所有 Unicode 十进制阿拉伯数字。
NaN
被格式化为单个字符,通常是
/uFFFD
。此字符由
DecimalFormatSymbols
对象所确定。这是惟一不使用前缀和后缀的值。
/u221E
,具有正数或负数前缀和后缀。无穷大值的字符由
DecimalFormatSymbols
对象所确定。
"-0"
)分析为
isParseBigDecimal()
为 true,则为 BigDecimal(0)
, isParseBigDecimal()
为 false 并且 isParseIntegerOnly()
为 true,则为 Long(0)
, isParseBigDecimal()
和 isParseIntegerOnly()
均为 false,则为 Double(-0.0)
。 // Print out a number using the localized number, integer, currency,
// and percent format for each locale
Locale[] locales = NumberFormat.getAvailableLocales();
double myNumber = -1234.56;
NumberFormat form;
for (int j=0; j<4; ++j) {
System.out.println("FORMAT");
for (int i = 0; i < locales.length; ++i) {
if (locales[i].getCountry().length() == 0) {
continue; // Skip language-only locales
}
System.out.print(locales[i].getDisplayName());
switch (j) {
case 0:
form = NumberFormat.getInstance(locales[i]); break;
case 1:
form = NumberFormat.getIntegerInstance(locales[i]); break;
case 2:
form = NumberFormat.getCurrencyInstance(locales[i]); break;
default:
form = NumberFormat.getPercentInstance(locales[i]); break;
}
if (form instanceof DecimalFormat) {
System.out.print(": " + ((DecimalFormat) form).toPattern());
}
System.out.print(" -> " + form.format(myNumber));
try {
System.out.println(" -> " + form.parse(form.format(myNumber)));
} catch (ParseException e) {}
}
}