JAVA也支持像C语言中的printf格式化输出,这对于某些特殊情况下的输出结果有了更便利的输出格式和排列能力。
在JAVA中所有的格式化功能均由java.util.Formatter类处理,可以将Formatter看做是一个翻译器,它将我们的格式化字符串与数据翻译成需要的结果,当我们创建一个Formatter对象时,需要向其构建器传递一些信息,告诉它最终结果的输出地,看下面一段代码:
package access;
import java.util.*;
import java.io.*;
public class Turtle {
private String name;
private Formatter f;
public Turtle(String name,Formatter f){
this.name = name;
this.f = f;
}
public void move(int x,int y){
f.format("%s The Turtle is at (%d,%d)\n", name,x,y);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
PrintStream outAlias = System.out;
Turtle tommy = new Turtle("Tommy",new Formatter(System.out));
Turtle terry = new Turtle("Terry",new Formatter(outAlias));
tommy.move(0, 0);
terry.move(4, 8);
tommy.move(3, 4);
terry.move(2, 5);
tommy.move(3, 3);
terry.move(3, 3);
}
}
此程序的输出结果为:
所有的tommy都将输出到System.out,所有的terry都将输出到System.out的一个别名outAlias上。
在插入数据时,通常想要控制空格与对齐,我们需要更加精细复杂的格式修饰符。最常见的应用是控制一个域的最小尺寸,通过制定width来实现,Formatter通过添加空格来确保一个域达到最小尺寸,默认情况下数据是右对齐的,但通过“-”可以改变数据对齐的方向。而precision用来指明最大尺寸,但是不同的是width可以应用于各种类型的数据转换,而不是所有的数据类型都能使用precision。并且在应用于不同的数据类型的转换时,precision的意义也不同,比如应用于String时,表示能打印出来的最大的字符数量;而应用于浮点数时,表示小数部分要显示出来的位数(默认6位),过多则舍,过少则补零;而由于整数没有小数位,所以不可用于整数,否则会触发异常。看下面一段代码:
package access;
import java.util.*;
public class Receipt {
private double total = 0;
private Formatter f = new Formatter(System.out);
public void printTitle(){
f.format("%-15s %5s %10s\n", "Item","Qty","Price");
f.format("%-15s %5s %10s\n", "----","---","-----");
}
public void print(String name,int qty,double price){
f.format("%-15.15s %5d %10.2f\n", name,qty,price);
total += price;
}
public void printTotal(){
f.format("%-15s %5s %10.2f\n", "Tax","",total*0.06);
f.format("%-15s %5s %10s\n", "","","-----");
f.format("%-15s %5s %10.2f\n", "Total","",total*1.06);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Receipt receipt = new Receipt();
receipt.printTitle();
receipt.print("Jack's Magic Beans", 4, 4.25);
receipt.print("Princess Peas", 3, 5.1);
receipt.print("Three Bears Porridge", 1, 14.29);
receipt.printTotal();
}
}
此程序的输出结果为:
Formatter的类型转换字符有:
d:整数型(十进制)。
c:Unicode字符。
b:Boolean值。
s:String。
f:浮点数(十进制)。
e:浮点数(科学计数)。
x:整数(十六进制)。
h:散列码(十六进制)。
%:字符“%”。
b转换对于各种类型都是合法的,但其行为不一定与我们想象的一致,对于boolean基本类型或对象,其转换结果都是对应的true或false,但是对于其他类型的参数,只有参数不为null,那么转换结果均为true,将b应用于非布尔类型的对象时需要多加注意。