System.out的print和println方法,可以向控制台输出不同类型的数据,可以满足程序调试信息的输出要求。在实际应用中,输出数据时,要求数据必须按照一定的格式输出,如数据精度要求,小数点后保留2位有效数字、按照规定的格式输出日期、按照表格方式输出数据等要求。
System.out的printf方法可以对数据进行格式化输出,printf方法在Java API 文档中声明如下:
void printf(String format, Object... args)
A convenience method to write a formatted string to this output stream using the specified format string and arguments.
中文注解:一个便捷的方法,使用指定的格式字符串和传入的参数,将格式化的字符串输出到输出流(输出设备)
传入的参数
String format
字符串类型,符合格式字符串语法描述的字符串
Object... args
格式字符串中格式说明符引用的参数,参数的数量是可变的,可以为零,参数的最大数量受Java虚拟机规范定义的Java数组的最大维数限制。
示例1:一个简单格式化输出的例子
在D盘Java目录下,新建“PrintfSample.java”文件。用记事本打开“PrintfSample.java”文件,输入以下代码:
public class PrintfSample {
public static void main(String args[])
{
/**
*声明双精度浮点变量并赋值,作为输出样例数据
*变量名称按照匈牙利命名法命名,以小写字母d开头,表示变量数据类型为double类型
*/
double dTemp = 129.6789603;
//用println方法输出dTemp
System.out.println("这是用println输出的数据:" + dTemp);
//用printf方法输出dTemp,保留2为有效小数
System.out.printf("%s:%.2f","这是用printf输出的数据",dTemp);
}
}代码结构分析
程序功能主要是演示println方法和printf的输出双精度浮点数的区别,println方法输出双精度浮点数时,不能对小数的有效位数控制输出,printf方法可以控制小数有效位数的输出。
程序增加了块注释语句,用于方法、语句以及变量的具体说明,提高程序代码的可读性和可维护性。块注释里的说明语句用“/*……*/”包括,每行说明语句用“*”开头。
printf语句中的“%s:%.2f”是格式字符串,其中“%s”是格式说明符,表示输出字符串,字符串内容取自格式字符串后面的参数,“%.2f”也是格式说明符,表示输出浮点数,并且保留2位有效小数,更改“%.”后面的数字,可以限制不同的小数位数输出,浮点数数值取自格式字符串后面的参数。参数跟在格式字符串后面,格式字符串中有多少个格式说明符,后面就有多少个参数,每个参数之间用英文逗号分隔。因为格式字符串“%s:%.2f”有两个格式说明符,因此在格式字符串后面应有两个参数,参数顺序与格式字符串中的格式说明符顺序保持一致,参数"这是用printf输出的数据"对应格式说明符%s,参数“dTemp”对应格式说明符%.2f。
编译“PrintfSample.java”文件,在命令行窗口输入“javac PrintfSample.java”并执行命令,编译通过后,在命令行窗口输入“java PrintfSample”运行Java程序,命令行窗口显示如下信息:

图 5-8 简单格式化输出执行结果
从运行结果可以看出,printf方法可以控制浮点数小数位数的输出。
printf方法常用格式说明符列表
%c 单个字符
%d 十进制整数
%f 十进制浮点数
%o 八进制数
%s 字符串
%u 无符号十进制数
%x 十六进制数
%% 输出百分号%
%b 输出逻辑状态值(true或false)
printf的常用格式控制:
% 0m.n格式字符
下面对组成格式说明的各项加以说明:
① % 格式说明的起始符号,不可缺少。
② 0 有0表示指定空位填0,如省略表示指定空位不填。
③ m.n m指域宽,即对应的输出项在输出设备上所占的字符数。n指精度。用于说明输出的实型数的小数位数。未指定n时,隐含的精度为n=6位。例如:%.2f,m位默认位数,小数保留2位;%9.2f,意思是位数为9位,小数保留2位;%09.2f,意思是位数为9位,小数保留2位,位数不足的用0补齐。
示例2:格式化输出的例子
在D盘Java目录下,新建“PrintfSample2.java”文件。用记事本打开“PrintfSample2.java”文件,输入以下代码:
public class PrintfSample2 {
public static void main(String args[])
{
/**
*声明字符串类型变量并赋值,作为输出样例数据
*变量名称按照匈牙利命名法命名,以小写字母组合sz开头,表示变量数据类型为字符类型
*/
String szTemp = "y格式化输出演示";
/**
*声明双精度浮点变量并赋值,作为输出样例数据
*变量名称按照匈牙利命名法命名,以小写字母d开头,表示变量数据类型为double类型
*/
double dTemp = 129.6789603;
/**
*声明字符型变量并赋值,作为输出样例数据
*变量名称按照匈牙利命名法命名,以小写字母ch开头,表示变量数据类型为字符类型
*/
char chTemp = 'a';
//用printf方法输出szTemp,字符串前后分别填充2个*字符
System.out.printf("**%s**\n",szTemp);
//用printf方法输出dTemp,位数宽度为9,保留2为有效小数,空位用0填充
System.out.printf("%s:%09.2f\n","输出浮点型变量",dTemp);
//用printf方法输出chTemp,分别输出字符、十进制、十六进制
System.out.printf("%s:%c:\n十进制:%d:\n十六进制:%x\n","输出字符型变量",chTemp,(int)chTemp,(int)chTemp);
}
}代码结构分析
程序功能主要是演示printf的格式化输出,分别格式化输出字符串、浮点型和字符型数据。
程序的变量命名采用了匈牙利命名法,匈牙利命名法是一种编程时的命名规范,匈牙利命名法的基本原则是对每一变量的名称都要求有明确含义,变量的类型通过规定的前缀字母来识别。例如:ch表示字符型数据、sz表示字符串类型、d表示双精度浮点数等。
在“System.out.printf("**%s**\n",szTemp);”语句中,“”**%s**\n"”是格式字符串,%s表示输出字符串,字符串的内容来自szTemp,%s前面和后面的**是要输出的字符串内容,格式字符串里面可以添加任何想要输出的内容。\n是换行符,下次输出时将会另起一行。
在“System.out.printf("%s:%09.2f\n","输出浮点型变量",dTemp); ”语句中,第一个%s的内容来自于格式字符串后面的第一个字符串参数“输出浮点型变量”,%09.2f表示输出9位数浮点数,保留2位有效小数,位数不足的,前面用0填充,浮点数值内容来自于dTemp。
该语句也可以改写为下面的语句,效果是等同的:
System.out.printf("输出浮点型变量:%09.2f\n",dTemp);
在输出字符型变量语句中,分别应用%c、 %d和%x将字符型变量按照字符、十进制数值和十六进制数值输出,其中“(int)”是将字符类型强制转换为int类型操作符,其意义是将字符强制转换为数值输出。
编译“PrintfSample2.java”文件,在命令行窗口输入“javac PrintfSample2.java”并执行命令,编译通过后,在命令行窗口输入“java PrintfSample2”运行Java程序,命令行窗口显示如下信息:

图 5-9 示例2格式化输出执行结果
从上面输出的结果可以看出,格式化输出方法printf可以按照程序指定的格式输出数据。

printf方法的第一个参数格式字符串包括两部分内容: 一部分是正常字符, 这些字符将按原样输出; 另一部分是格式化规定字符, 以%开始, 后跟一个或几个规定字符,用来确定输出内容格式。printf方法的第二个参数是参量表,参量表是需要输出的一系列参数, 其个数必须与格式化字符串所说明的输出参数个数一样多, 各参数之间用“,”分开, 且顺序须一一对应, 否则将会出现意想不到的错误。
编写一个程序,用printf方法输出一个购物小票,输出格式参见下面的样式,商品金额数值要求为5位数,不足5位数的,前面用0填充,保留2位有效小数。
***购物小票***
商品名称:办公用品
金额:189.90元
付款:00200元
找零:0010.1元