学习目标:掌握printf()方法的使用,对输出的内容进行格式化设置。
System.out的print和println方法,可以向控制台输出不同类型的数据,能够满足程序调试信息的输出要求。在实际应用中,输出数据时,有时要求数据必须按照一定的格式输出,如数据精度要求,小数点后保留2位有效数字、按照规定的格式输出日期、按照表格方式输出数据等要求。
System.out的printf方法可以对数据进行格式化输出,printf方法在Java API 文档中声明如下:
void printf(String format, Object... args)
中文注解:一个便捷的方法,使用指定的格式字符串和传入的参数,将格式化的字符串输出到输出流(输出设备)
传入的参数
String format
字符串类型,符合格式字符串语法描述的字符串
Object... args
格式字符串中格式说明符引用的参数,参数的数量是可变的,可以为零,参数的数量没有限制。
案例18:一个简单格式化输出的例子。在Punit2项目unit包下创建Case18类。代码如下:
package com.unit;
/**
* 日期:2021/4/5
* 创建者:xinch
*/
public class Case18 {
/**
* @author:xinch
* @date:2021/4/5
* @description:使用printf保留2位小数
*/
public static void main(String[] args) {
/**
* 声明双精度浮点变量并赋值,
*/
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。
程序执行结果如下图所示:

从运行结果可以看出,printf方法可以控制浮点数小数位数的输出。
printf方法常用格式控制符列表
%c 单个字符
%d 十进制整数
%f 十进制浮点数
%o 八进制数
%s 字符串
%u 无符号十进制数
%x 十六进制数
%% 输出百分号%
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补齐。
案例19:格式化输出案例。在Punit19项目unit包下创建Case19类。代码如下:
package com.unit;
/**
* 日期:2021/4/5
* 创建者:xinch
*/
public class Case19 {
/**
* @author:xinch
* @date:2021/4/5
* @description:函数入口
*/
public static void main(String[] args) {
/**
* 声明字符串类型变量并赋值,
*/
String szTemp = "格式化输出演示";
/**
* 声明双精度浮点变量并赋值,
*/
double dTemp = 129.6789603;
/**
* 声明字符型变量并赋值,
*/
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类型操作符,其意义是将字符强制转换为数值输出。
程序执行结果如下图所示:

printf方法的第一个参数格式字符串包括两部分内容: 一部分是正常字符, 这些字符将按原样输出; 另一部分是格式化规定字符, 以%开始, 后跟一个或几个规定字符,用来确定输出内容格式。printf方法的第二个参数是参量表,参量表是需要输出的一系列参数, 其个数必须与格式化字符串所说明的输出参数个数一样多, 各参数之间用“,”分开, 且顺序须一一对应, 否则将会出现意想不到的错误。