在控制台输出时基于格式考虑需要对相关数字的显示方式进行限定,比如对其设置整体显示宽度,小数点后保留几位数,是否按照千位进行逗号隔开等。这里小结两个途径。
1. 使用“System.out.format”
“format”方法与“printf”方法基本效果都一样,都可以是向控制台输出内容,但“format”方法可以进行一定的格式修饰。
格式占位符:“%d”表示一个整数;“%f”表示一个浮点数。
在“%”和“d”(或“f”)中间可以指定对齐方式(减号是左对齐)、是否需要千分位分隔符(逗号)、是否制定宽度(整型长度)、小数点后保留几位等设置。
让我们用[源码]理解:
public class Demo11 {
public static void main(String[] args){
double num = 698756886.825;
System.out.printf("%7.2f\n",num);
//System.out.printf("%-f",num);//注意:这样写会导致异常报错!!!
System.out.format("%-7.2f\n",num);
//System.out.format("%-f",num); //注意:这样写会导致异常报错!!!
System.out.format("%-,7.2f",num);//千分位分隔符
}
}
输出结果:
理解其功能:
System.out.format("%-,7.2f",num);//千分位分隔符
代码中减号(“-”)表示左对齐;逗号(“,”)表示需要千分位分隔;7表示整体占位长度;“.2”表示小数点后保留两位。
注意为什么直接写“-f”会出现异常呢?
有待商讨!欢迎读者在评论区谈谈自己的想法~
2. DecimalFormat类
可以使用 java.test.DecimalFormat 类来控制前零和后零、分组(千位)分隔符和小数点位数限制的显示。
DecimalFormat类理解
API文档的解释:
- 是 NumberFormat 的一个子类,用于格式化十进制数字。
- DecimalFormat 类包含一个模式和一组符号,常用符号的说明如下图所示。
用一段代码理解说明:
//第一步,导入包
import java.text.DecimalFormat;
public class Demo12 {
public static void main(String[] args){
//第二步,准备DecimalFormat类,并设置好样式
DecimalFormat df = new DecimalFormat("$###,###.###");
double num = 12345.6789;
//第三步,得到格式化后的字符串
String output = df.format(num);
System.out.println(output);
}
}
输出结果:
格式控制代码中,逗号表示使用千分位分隔符;实心点后面的“#”数量表示小数点后留几位;最前面的“$”表示美元符。
如果把上面代码样式中的“#”改为“0”,会输出什么样式呢?涌现代码测试下。
//第一步,导入包
import java.text.DecimalFormat;
public class Demo12 {
public static void main(String[] args){
//第二步,准备DecimalFormat类,并设置好样式
DecimalFormat df = new DecimalFormat("$000,000.00000");
double num = 12345.6789;
//第三步,得到格式化后的字符串
String output = df.format(num);
System.out.println(output);
}
}
输出结果:
实现了前后补“0”的效果。
综合来看,DecimalFormat类的使用可能稍微显麻烦,但是它不是基于控制台,因此后续再不同平台迁移时灵活性更好,在解决实际问题时使用非常普遍。
习题:
任务描述:
完成薪资转换工具,具体如下:当用户输入月薪时,计算出对应的日薪(每月工作日22天)和年薪(1年13薪),并进行输出显示,如下图:
问题分析
分析任务描述,需要根据用户输入的月薪计算日薪和年薪并进行输出;需要准备三个double类型的变量分别存储月薪、日薪和年薪。
设计流程
- 接收用户输入月薪;
- 进行业务处理;
- 按要求格式化输出结果。
实现功能[代码]
import java.text.DecimalFormat;
import java.util.Scanner;
/**
* 薪资转换工具
*/
public class Demo13 {
public static void main(String[] args){
//提示用户输入月薪并接收
System.out.println("******薪资转换工具v1.0******");
System.out.print("请输入月薪(人民币):");
Scanner input = new Scanner(System.in);
double salary = input.nextDouble();//输入月薪
//进行业务处理
double dateSalary = salary / 22;//每月22个工作日
double yearSalary = salary * 13;//一年发放13月薪资
//格式化输出
//方法一(比较复杂)
/*DecimalFormat df = new DecimalFormat("¥###.##");
System.out.println("您的日薪:" + df.format(dateSalary));
DecimalFormat df_1 = new DecimalFormat("¥000,000.00");
System.out.println("您的年薪:" + df_1.format(yearSalary));*/
//方法二
DecimalFormat df = new DecimalFormat("¥###,###.00");
System.out.format("您的日薪:%-10.2f\n",dateSalary);
System.out.println("您的年薪:" + df.format(yearSalary));
}
}