Customizing Formats
您可以使用DecimalFormat
类将十进制数字格式化为特定于语言环境的字符串。此类允许您控制前导和尾随零,前缀和后缀,分组(千位)分隔符和十进制分隔符的显示。如果要更改格式符号(例如小数点分隔符),则可以将DecimalFormatSymbols
与DecimalFormat
类结合使用。这些类在数字格式设置方面提供了很大的灵 Active,但是它们会使您的代码更复杂。
下面的文本使用示例来演示DecimalFormat
和DecimalFormatSymbols
类。本资料中的代码示例来自一个名为DecimalFormatDemo的示例程序。
Constructing Patterns
您可以使用String
Pattern 指定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
是要格式化的数字double
。 pattern
是用于指定格式设置属性的String
。 output
是String
,表示格式化的数字。
来自DecimalFormatDemo
程序的输出
value |
pattern |
output |
Explanation |
---|---|---|---|
123456.789 | ###,###.### | 123,456.789 | 井号(#)表示一个数字,逗号是分组分隔符的占位符,句点是十进制分隔符的占位符。 |
123456.789 | ###.## | 123456.79 | value 小数点右边有三位数,而pattern 只有两位。 format 方法通过四舍五入来处理此问题。 |
123.78 | 000000.000 | 000123.780 | pattern 指定前导零和尾随零,因为使用 0 字符代替了井号(#)。 |
12345.67 | $###,###.### | $12,345.67 | pattern 中的第一个字符是美元符号($)。请注意,它紧接在格式output 中最左边的数字之前。 |
12345.67 | \u00A5###,###.### | ¥12,345.67 | pattern 用 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
类。异常格式是调用setDecimalSeparator
,setGroupingSeparator
和setGroupingSize
方法的结果。
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'* '#'*
下表解释了上图中使用的表示法:
Notation | Description |
---|---|
X* |
0 个或更多 X 实例 |
(X | Y) |
X 或 Y |
X..Y |
从 X 到 Y 的任何字符,包括 |
S - T |
S 中的字符,T 中的字符除外 |
{X} |
X 是可选的 |
在前面的 BNF 图中,第一个子 Pattern 指定正数的格式。第二个子 Pattern 是可选的,它指定负数的格式。
尽管在 BNF 图中未注明,但逗号可能会出现在整数部分内。
在子 Pattern 中,可以使用特殊符号指定格式。下表描述了这些符号:
Symbol | Description |
---|---|
0 | a digit |
# | 一个数字,零表示不存在 |
. | 小数点分隔符的占位符 |
, | 分组分隔符的占位符 |
E | 以指数格式分隔尾数和指数 |
; | separates formats |
- | 默认负前缀 |
% | 乘以 100 并显示为百分比 |
? | 乘以 1000 并显示为千分之一 |
¤ | 货币符号;替换为货币符号;如果翻倍,则用国际货币符号代替;如果存在于 Pattern 中,则使用货币十进制分隔符代替十进制分隔符 |
X | 前缀或后缀中可以使用任何其他字符 |
' | 用于在前缀或后缀中引用特殊字符 |