88. Java 数字和字符串 - DecimalFormat 类基本用法
一、引言
在实际开发中,我们常常需要将数字格式化为特定的字符串形式。Java 中的 java.text.DecimalFormat 类提供了极大的灵活性,可以控制数字的显示方式,例如前导零、尾随零、前缀和后缀、分组符(千位分隔符)以及小数点分隔符。但同时它也可能使代码变得复杂,因此在使用时需要理解其模式(pattern)的规则和内涵。
二、DecimalFormat 基本用法
2.1 模式和符号说明
DecimalFormat通过传入一个模式字符串来定义格式。模式中常用的符号及其含义如下:
- #:表示数字,如果该位数字不存在则不显示(不会补零)。
- 0:表示数字,如果位数不足则以 0 填充,保证显示该位数字。
- ,:分组分隔符,用于千位分隔(在整数部分)。
- .:小数点分隔符。
- $、¤:可以作为前缀或后缀,常用于表示货币;¤ 若双写则显示国际货币符号。
例如:
"###,###.###":显示整数部分每三位加逗号,小数部分最多显示 3 位。"000000.000":强制显示至少 6 位整数和 3 位小数,不足部分用 0 补齐。"$###,###.###":在格式化后的字符串最左边加上美元符号。
2.2 示例程序
下面的示例程序演示了如何使用 DecimalFormat 格式化数字:
import java.text.*;
public class DecimalFormatDemo {
static public void customFormat(String pattern, double value) {
DecimalFormat myFormatter = new DecimalFormat(pattern);
String output = myFormatter.format(value);
System.out.println(value + " " + pattern + " " + output);
}
public static void main(String[] args) {
customFormat("###,###.###", 123456.789);
customFormat("###.##", 123456.789);
customFormat("000000.000", 123.78);
customFormat("$###,###.###", 12345.67);
}
}
123456.789 ###,###.### 123,456.789
123456.789 ###.## 123456.79
123.78 000000.000 000123.780
12345.67 $###,###.### $12,345.67
输出说明:
| 值 | 模式 | 输出 | 解释 |
|---|---|---|---|
123456.789 | ###,###.### | 123,456.789 | # 表示数字,逗号为分组占位符,句点为小数点占位符。 |
123456.789 | ###.## | 123456.79 | 小数点右侧原有 3 位,但模式只有 2 位,因此结果经过四舍五入。 |
123.78 | 000000.000 | 000123.780 | 模式用 0 补齐前导和尾随零。 |
12345.67 | $###,###.### | $12,345.67 | 模式前置美元符号,且分组符号控制整数部分显示。 |
三、DecimalFormat 的进阶特性
3.1 控制符号和自定义格式
除了基本的数字格式化,DecimalFormat 还支持通过 DecimalFormatSymbols 类来自定义各种格式符号,如小数分隔符和分组符号。示例:
import java.text.*;
import java.util.Locale;
public class CustomSymbolsDemo {
public static void main(String[] args) {
DecimalFormatSymbols unusualSymbols = new DecimalFormatSymbols(Locale.getDefault());
unusualSymbols.setDecimalSeparator('|'); // 将小数点替换为竖线
unusualSymbols.setGroupingSeparator('^'); // 将分组符号替换为^
String pattern = "#,##0.###";
DecimalFormat weirdFormatter = new DecimalFormat(pattern, unusualSymbols);
weirdFormatter.setGroupingSize(4); // 分组大小设置为4位
String output = weirdFormatter.format(12345.678);
System.out.println(output); // 输出:1^2345|678
}
}
3.2 舍入模式
默认情况下,DecimalFormat 使用 RoundingMode.HALF_EVEN(银行家算法)。这种舍入方式会根据前一位是奇数还是偶数来决定四舍五入:
- 若前一位为偶数,遇到精度截断时则舍去(如
3.25保留一位小数结果为3.2)。 - 若前一位为奇数,则进一(如
3.35保留一位小数结果为3.4)。
如果希望实现标准的四舍五入(即 RoundingMode.HALF_UP),可以通过以下方式设置:
// 创建 DecimalFormat 实例
DecimalFormat df = new DecimalFormat("#.#");
// 设置舍入模式为 RoundingMode.HALF_UP
df.setRoundingMode(RoundingMode.HALF_UP);
// 测试数据
double num1 = 3.25;
double num2 = 3.35;
// 格式化数据
String result1 = df.format(num1);
String result2 = df.format(num2);
// 输出结果
System.out.println("3.25 保留一位小数,结果为: " + result1);
System.out.println("3.35 保留一位小数,结果为: " + result2);
3.25 保留一位小数,结果为: 3.3
3.35 保留一位小数,结果为: 3.4
改为银行家算法df.setRoundingMode(RoundingMode.HALF_EVEN);将输出:
3.25 保留一位小数,结果为: 3.2
3.35 保留一位小数,结果为: 3.4
四、总结
DecimalFormat的核心在于模式字符串,模式中的#和0决定了数字显示的精度和补零方式。- 自定义符号:通过
DecimalFormatSymbols可自定义小数分隔符、分组符号等。 - 舍入策略:默认使用银行家算法,如果需要四舍五入,可通过
setRoundingMode方法设置。 - 实际应用:根据不同需求,可用于格式化货币、百分比等各种数字显示。