Java DecimalFormat

时间:2020-01-09 10:35:26  来源:igfitidea点击:

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.456123.456
###。#123.456123.5
###,###。##123456.789123,456.79
000。###9.95009.95
## 0。###0.950.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个"#"字符。