Customizing Formats

您可以使用DecimalFormat类将十进制数字格式化为特定于语言环境的字符串。此类允许您控制前导和尾随零,前缀和后缀,分组(千位)分隔符和十进制分隔符的显示。如果要更改格式符号(例如小数点分隔符),则可以将DecimalFormatSymbolsDecimalFormat类结合使用。这些类在数字格式设置方面提供了很大的灵 Active,但是它们会使您的代码更复杂。

下面的文本使用示例来演示DecimalFormatDecimalFormatSymbols类。本资料中的代码示例来自一个名为DecimalFormatDemo的示例程序。

Constructing Patterns

您可以使用StringPattern 指定DecimalFormat的格式设置属性。该 Pattern 确定格式化后的数字是什么样。有关 Pattern 语法的完整说明,请参见数字格式 Pattern 语法

下面的示例通过将 PatternString传递给DecimalFormat构造函数来创建格式化程序。 format方法接受double值作为参数,并以String返回格式化的数字:

DecimalFormat myFormatter = new DecimalFormat(pattern);
String output = myFormatter.format(value);
System.out.println(value + " " + pattern + " " + output);

下表描述了前几行代码的输出。 value是要格式化的数字doublepattern是用于指定格式设置属性的StringoutputString,表示格式化的数字。

来自DecimalFormatDemo程序的输出

valuepatternoutputExplanation
123456.789###,###.###123,456.789井号(#)表示一个数字,逗号是分组分隔符的占位符,句点是十进制分隔符的占位符。
123456.789###.##123456.79value小数点右边有三位数,而pattern只有两位。 format方法通过四舍五入来处理此问题。
123.78000000.000000123.780pattern指定前导零和尾随零,因为使用 0 字符代替了井号(#)。
12345.67$###,###.###$12,345.67pattern中的第一个字符是美元符号($)。请注意,它紧接在格式output中最左边的数字之前。
12345.67\u00A5###,###.###¥12,345.67pattern用 Unicode 值 00A5 指定日元(¥)的货币符号。

Locale-Sensitive Formatting

前面的示例为默认的Locale创建了一个DecimalFormat对象。如果要使用DecimalFormat对象作为非默认值Locale,请实例化NumberFormat,然后将其强制转换为DecimalFormat。这是一个例子:

NumberFormat nf = NumberFormat.getNumberInstance(loc);
DecimalFormat df = (DecimalFormat)nf;
df.applyPattern(pattern);
String output = df.format(value);
System.out.println(pattern + " " + output + " " + loc.toString());

运行前面的代码示例将产生以下输出。第二列中的格式化数字随Locale的不同而不同:

###,###.###      123,456.789     en_US
###,###.###      123.456,789     de_DE
###,###.###      123 456,789     fr_FR

到目前为止,此处讨论的格式化 Pattern 均遵循美国英语的惯例。例如,在 Pattern###,###。##中,逗号是千位分隔符,而句点则代表小数点。只要您的final用户没有接触到此约定,就可以了。但是,某些应用程序(例如电子表格和报告生成器)允许final用户定义自己的格式设置 Pattern。对于这些应用程序,final用户指定的格式化 Pattern 应使用本地化的表示法。在这些情况下,您需要在DecimalFormat对象上调用applyLocalizedPattern方法。

更改格式符号

您可以使用DecimalFormatSymbols类来更改出现在format方法生成的带格式数字中的符号。这些符号包括小数点分隔符,分组分隔符,减号和百分号等。

下一个示例通过对数字应用奇怪的格式来演示DecimalFormatSymbols类。异常格式是调用setDecimalSeparatorsetGroupingSeparatorsetGroupingSize方法的结果。

DecimalFormatSymbols unusualSymbols = new DecimalFormatSymbols(currentLocale);
unusualSymbols.setDecimalSeparator('|');
unusualSymbols.setGroupingSeparator('^');

String strange = "#,##0.###";
DecimalFormat weirdFormatter = new DecimalFormat(strange, unusualSymbols);
weirdFormatter.setGroupingSize(4);

String bizarre = weirdFormatter.format(12345.678);
System.out.println(bizarre);

运行时,此示例以奇怪的格式打印数字:

1^2345|678

数字格式 Pattern 语法

您可以按照以下 BNF 图指定的规则设计自己的数字格式格式:

pattern    := subpattern{;subpattern}
subpattern := {prefix}integer{.fraction}{suffix}
prefix     := '\\u0000'..'\\uFFFD' - specialCharacters
suffix     := '\\u0000'..'\\uFFFD' - specialCharacters
integer    := '#'* '0'* '0'
fraction   := '0'* '#'*

下表解释了上图中使用的表示法:

NotationDescription
X*0 个或更多 X 实例
(X | Y)X 或 Y
X..Y从 X 到 Y 的任何字符,包括
S - TS 中的字符,T 中的字符除外
{X}X 是可选的

在前面的 BNF 图中,第一个子 Pattern 指定正数的格式。第二个子 Pattern 是可选的,它指定负数的格式。

尽管在 BNF 图中未注明,但逗号可能会出现在整数部分内。

在子 Pattern 中,可以使用特殊符号指定格式。下表描述了这些符号:

SymbolDescription
0a digit
#一个数字,零表示不存在
.小数点分隔符的占位符
,分组分隔符的占位符
E以指数格式分隔尾数和指数
;separates formats
-默认负前缀
%乘以 100 并显示为百分比
?乘以 1000 并显示为千分之一
¤货币符号;替换为货币符号;如果翻倍,则用国际货币符号代替;如果存在于 Pattern 中,则使用货币十进制分隔符代替十进制分隔符
X前缀或后缀中可以使用任何其他字符
'用于在前缀或后缀中引用特殊字符