Java DecimalFormat
java.text.DecimalFormat
类用于使用我们自己指定的格式设置格式设置数字格式。本文说明了如何使用DecimalFormat类来格式化不同类型的数字。
创建一个DecimalFormat
创建DecimalFormat
实例是这样完成的:
String pattern = "###,###.###"; DecimalFormat decimalFormat = new DecimalFormat(pattern);
传递给DecimalFormat构造函数的pattern参数是数字格式所依据的数字模式。
applyPattern()+ applyLocalizedPattern()
如我们所见,DecimalFormat
是使用格式化模式创建的。我们可以稍后使用applyPattern()
或者applyLocalizedPattern()
方法更改此模式。这是两个示例:
decimalFormat.applyPattern("#0.##"); decimalFormat.applyLocalizedPattern("#0,##");
applyPattern()方法仅将新模式应用于DecimalFormat实例,就好像它是使用该模式创建的一样。
" applyLocalizedPattern()"与" applyPattern()"的作用相同,只是它根据创建" DecimalFormat"的" Locale"解释模式中的字符。这意味着用于指示小数点分隔符位置的字符等现在将根据用于该"区域设置"的字符进行解释,而不仅仅是在模式中使用标准标记字符。
如果我们看上面的示例,请注意第二个模式使用逗号作为小数(分数)分隔符,而不是普通点。在丹麦语中,数字的整数部分和小数部分之间使用逗号而不是点。因此,本地化模式也使用逗号。
通常,我们不需要使用applyLocalizedPattern()
方法。在某些情况下,这是有道理的,也就是说,当我们允许用户键入格式格式时。丹麦用户自然会以这种方式使用与英语用户不同的符号。
在本文的后面部分将介绍为特定的"语言环境"构造一个" DecimalFormat"的方法。
格式化数字
我们可以使用DecimalFormat实例的format()方法格式化数字。这是一个例子:
String pattern = "###,###.###"; DecimalFormat decimalFormat = new DecimalFormat(pattern); String format = decimalFormat.format(123456789.123); System.out.println(format);
此代码输出的输出为:
123.456.789,123
为特定语言环境创建DecimalFormat
上一节为运行代码的JVM(计算机)的默认Locale创建了DecimalFormat。如果我们想为特定的Locale创建一个DecimalFormat实例,请创建一个NumberFormat并将其转换为DecimalFormat。这是一个例子:
Locale locale = new Locale("en", "UK"); String pattern = "###.##"; DecimalFormat decimalFormat = (DecimalFormat) NumberFormat.getNumberInstance(locale); decimalFormat.applyPattern(pattern); String format = decimalFormat.format(123456789.123); System.out.println(format);
此代码输出的输出为:
123456789.12
如果我们使用的是丹麦语" Locale",则输出为:
123456789,12
请注意,使用逗号而不是点将整数部分与数字的小数部分分开。
数字格式模式语法
我们可以在格式设置模式中使用以下字符:
0 | 数字-始终显示,即使数字位数较少(然后显示0) |
# | 一个数字,省略前导零。 |
。 | 标记小数点分隔符 |
, | 标记分组分隔符(例如千位分隔符) |
E | 标记为指数格式的尾数和指数分隔。 |
; | 分隔格式 |
- | 标记负数前缀 |
% | 乘以100并将数字显示为百分比 |
? | 乘以1000,并显示每毫的数字 |
¤ | 货币符号-替换为Locale的货币符号。 还使格式化使用货币小数点分隔符代替普通的十进制分隔符。 ¤¤使格式化使用国际货币符号。 |
X | 标记要在数字前缀或者后缀中使用的字符 |
' | 在带格式数字的前缀或者后缀中的特殊字符周围加上引号。 |
以下是一些使用UKLocale
格式化的示例:
模式 | 数字 | 格式化的字符串 |
###。### | 123.456 | 123.456 |
###。# | 123.456 | 123.5 |
###,###。## | 123456.789 | 123,456.79 |
000。### | 9.95 | 009.95 |
## 0。### | 0.95 | 0.95 |
注意,一些数字是四舍五入的,就像使用NumberFormat实例一样。
DecimalFormatSymbols
我们可以使用DecimalFormatSymbols
实例来自定义哪些符号用作小数点分隔符,分组分隔符等。这是一个例子:
Locale locale = new Locale("en", "UK"); DecimalFormatSymbols symbols = new DecimalFormatSymbols(locale); symbols.setDecimalSeparator(';'); symbols.setGroupingSeparator(':'); String pattern = "#,##0.###"; DecimalFormat decimalFormat = new DecimalFormat(pattern, symbols); String number = decimalFormat.format(123456789.123); System.out.println(number);
此代码输出的输出为:
123:456:789;123
请注意,将:
用作千位分隔符,将;
用作十进制分隔符(分数分隔符)。这些是在传递给DecimalFormat构造函数的DecimalFormatSymbols实例上设置的符号。
我们可以设置更多的符号。这是可以在DecimalFormatSymbols
实例上调用的方法的列表:
setDecimalSeparator(); setGroupingSeparator(); setCurrency(); setCurrencySymbol(); setDecimalSeparator(); setDigit(); setExponentSeparator(); setGroupingSeparator(); setInfinity(); setInternationalCurrencySymbol(); setMinusSign(); setMonetaryDecimalSeparator(); setNaN(); setPatternSeparator(); setPercent(); setPerMill(); setZeroDigit();
有关这些方法的函数的完整说明,请参见DecimalFormatSymbols类的JavaDoc。
分组数字
DecimalFormat类具有称为setGroupingSize()的方法,该方法设置要分组的整数部分的位数。组由分组分隔符分隔。这是一个例子:
String pattern = "#,###.###"; DecimalFormat decimalFormat = new DecimalFormat(pattern); decimalFormat.setGroupingSize(4); String number = decimalFormat.format(123456789.123); System.out.println(number);
此代码输出的输出为:
1,2345,6789.123
请注意,现在如何将数字的整数部分按每组4位数字而不是正常的3位数字进行分组。
只需更改模式字符串,就可以实现相同的效果,如下所示:
String pattern = "####,####.###"; DecimalFormat decimalFormat = new DecimalFormat(pattern); String number = decimalFormat.format(123456789.123); System.out.println(number);
注意在模式中的每个组中如何使用4个"#"字符。