数字格式化在解决实际问题时应用非常普遍,如表示某超市的商品价格,需要保留两位有效数字等。数字格式化操作主要针对的是浮点型数据,包括 double 型和 float 型数据。在 Java 中使用 java.text.DecimalFormat 格式化数字。在 Java 中没有格式化的数据遵循以下规则:
- 如果数据绝对值大于 0.001 并且小于 10000000,使用常规小数形式表示;
- 如果数据绝对值小于 0.001 或者大于 10000000,使用科学计数法表示
由于上述输出格式不能满足解决实际问题的要求,通常将结果格式化为指定形式后输出。在 Java 中可以使用 DecimalFormat 类进行格式化操作。DecimalFormat 是 NumberFormat 的一个子类,用于格式化十进制数字。它可以将一些数字格式化为整数、浮点数、百分数等。通过使用该类可以为要输出的数字加上单位或控制数字的精度。一般情况下可以在实例化 DecimalFormat 对象时传递数字格式,也可以通过 DecimalFormat 类中的 applyPattern() 方法来实现数字格式化。当格式化数字时,在 DecimalFormat 类中使用一些特殊字符构成一个格式化模板,是数字按照一定的特殊字符规则进行匹配。以下列举了格式化模板中的特殊字符及其所代表的含义
字符 | 说明 |
---|---|
0 | 代表阿拉伯数字,使用特殊字符“0”表示数字的一位阿拉伯数字,如果该位不存在数字,则显示 0 |
# | 代表阿拉伯数字,使用特殊字符“#”表示数字的一位阿拉伯数字,如果该位存在数字,则显示字符;如果该位不存在数字,则不显示 |
. | 小数分隔符或货币小数分隔符 |
- | 负号 |
, | 分组分隔符 |
E | 分隔科学计数法中的尾数和指数 |
% | 本符号放置在数字的前缀或后缀,将数字乘以 100 显示为百分数 |
\u2030 | 本符号放置在数字的前缀或后缀,将数字乘以 1000 显示为千分数 |
\u00A4 | 本符号放置在数字的前缀或后缀,作为货币记号 |
' | 单引号,当上述特殊字符出现在数字中时,应为特殊字符添加单引号,系统会将此符号视为普通符号处理 |
import java.text.DecimalFormat;
public class DecimalFormatDemo {
//使用实例化对象时设置格式化模式
static public void SimpleFormat(String pattern, double value) {
// 实例化 DecimalFormat 对象
DecimalFormat decimalFormat = new DecimalFormat(pattern);
// 将数字进行格式化
String result = decimalFormat.format(value);
System.out.println("value = " + value + " pattern = " + pattern + " 格式化结果为:" + result);
}
//使用 applyPattern() 方法对数字进行格式化
static public void applyPatternFormat(String pattern, double value) {
// 实例化 DecimalFormat 对象
DecimalFormat decimalFormat = new DecimalFormat();
// 调用 applyPattern() 方法设置格式化模板
decimalFormat.applyPattern(pattern);
System.out.println("value = " + value + " pattern = " + pattern + " 格式化结果为:" + decimalFormat.format(value));
}
public static void main(String[] args) {
// 调用静态 SimpleFormat() 方法
SimpleFormat("###,###,###.###", 123456789.789);
// 在数字后面加上单位
SimpleFormat("00000000.###kg", 123456.789);
// 按照格式模板格式化数字,不存在的位以0显示
SimpleFormat("000000.000", 123.456);
// 将数字转换为百分数形式
applyPatternFormat("##.##%", 12.34);
// 将数字转换为千分数形式
applyPatternFormat("##.##\u2030", 12.34);
// 将小数点后格式化为两位
applyPatternFormat("######.##", 123456.789);
}
}
除此之外,还可使用 setGroupingSize() 和 setGroupingUsed() 方法来对数字进行分组操作。
import java.text.DecimalFormat;
public class DecimalFormatDemo {
public static void main(String[] args) {
DecimalFormat decimalFormat = new DecimalFormat();
decimalFormat.setGroupingSize(2); // 设置将数字分组为2
double value = 123456.789;
String result = decimalFormat.format(value);
System.out.println("将" + value + "以每两个数字分组,结果为:" + result);
decimalFormat.setGroupingUsed(false); // 设置不允许数字进行分组
String result1 = decimalFormat.format(value);
System.out.println("不允许数字分组:" + result1);
}
}