程序员在控制台上输出文本时很多情况下要控制数据所占宽度,如果使用普通的print()和println()方法输出数据,控制宽度的工作要人工完成,费时费力却效果不理想。为解决这个问题,Java语言提供了Formatter类来完成控制数据宽度的工作。Formatter类位于java.util包下,它通过占位符来设置所输出数据的宽度。除了控制数据宽度的操作之外,Formatter类还有很多功能,例如能以不同进制输出整数,能够控制浮点数保留小数的位数,能以科学计数法的形式输出浮点数,能以特定格式输出日期时间等。由于它的功能与SimpleDateFormate类、DecimalFormat类等有很多重复,因此程序员大部分情况下只使用Formatter类独有的控制数据宽度功能,而如格式化输出日期时间、格式化输出数字等操作都用更为专业的SimpleDateFormate类、DecimalFormat类等其他格式化类来完成。
实际开发过程中实际上,如果需要控制数据在控制台上的宽度,程序员在大多数情况下都不会直接使用Formatter类的对象来输出数据,而是使用printf()方法输出数据。printf()方法内部本质上也是通过Formatter类的对象来控制数据的宽度,但由于printf()与println()方法一样,都可以通过System类的out静态属性直接调用,不需要创建对象,因此使用更加方便。下面的【例11_32】展示了使用Formatter类以及printf()方法完成控制数据宽度的效果。
【例11_32 控制数据宽度】
Exam11_32.java
import java.util.Formatter;
public class Exam11_32 {
public static void main(String[] args) {
Formatter formatter = new Formatter(System.out);
System.out.println("使用Formatter类对象完成输出:");
formatter.format("输出3个整数,宽度为4(右对齐):");
formatter.format("%4d%4d%4d\n",8,15,136);//①
formatter.format("输出3个整数,宽度为4(左对齐):");
formatter.format("%-4d%-4d%-4d\n",8,15,136);
formatter.format("输出3个浮点数,宽度为7保留2位小数(右对齐):");
formatter.format("%7.2f%7.2f%7.2f\n",8.231,15.334,13.677);
formatter.format("以科学计数法输出3个浮点数,宽度为9保留2位小数(右对齐):");
formatter.format("%9.2e%9.2e%9.2e\n",8.231,15.334,13.677);
formatter.format("输出3个字符串,宽度为6(右对齐):");
formatter.format("%6s%6s%6s\n","Mike","Peter","Joe");
System.out.println("使用printf()方法完成输出:");
System.out.printf("输出3个字符串,宽度为6(右对齐):");
System.out.printf("%6s%6s%6s\n","Mike","Peter","Joe");
}
}
【例11_32】用Formatter类对象和printf()方法两种方式完成数据的输出。两种方式都不会有换行效果,因此在完成输出时需要以\n转义字符实现换行。每次输出都是先用一个字符串完成输出内容的基本格式设定,设定格式时使用占位符来代替数据。例如语句①中的“%4d%4d%4d”就是输出内容的基本格式,“%”表示占位符,每个占位符对应一个数据,占位符在完成输出时会被后面的数据所代替,%后面的数字表示数据的宽度,因此“%4”就表示这个数据在被输出时占据4个字符的宽度。每种类型的数据都有特定的表示符号,“d”表示整数,“f”表示浮点数,“e”表示科学计数法形式的浮点数,而“s”表示字符串,因此“%4d”就表示宽度为4的整数。默认情况下,如果数据本身的宽度小于设置的宽度,则按右对齐形式显示数据。例如语句①中第一个“%4d”在实际输出时会被方法参数中第一个整数8代替,由于数字8的宽度达不到4,因此会显示数字8时会按右对齐显示。如果希望数据按左对齐方式显示,则需要在表示数据宽度的数字前加一个“-”,例如“%-4d”就表示输出整数时,整数的宽度占4个字符,并且左对齐。需要注意:输出的数据中并非只有数字要占用宽度,而是所有字符都要占据宽度,例如浮点数中小数点也占据一个字符的宽度,科学计数法的字母e以及指数的正负号也都占据一个字符的宽度。如果指定浮点数的保留小数位数,则需要在总宽度的后面加“.”,然后在“.”的后面设置保留小数的位数。例如“%7.2f”就表示浮点数总宽度为7,小数保留2位,小数点2位之后的数字以四舍五入的方式进行舍弃。如果使用科学计数法的形式表示浮点数,则“.”之后的数字为系数保留小数的位数,例如13.677表示为科学计数法为1.3677×101但设置系数只保留2位小数,因此这个浮点数会被转换为1.37×101。【例11_32】的运行结果如图11-31所示。
图11-31【例11_32】运行结果
从图11-31可以看出:使用Formatter类完成数据的输出和使用printf()方法完成数据输出的效果是一样的,本例中仅展示了使用printf()方法输出字符串的效果,读者可以尝试使用printf()方法输出其他类型数据。
本文字版教程还配有更详细的视频讲解,小伙伴们可以点击这里观看。