在jdk SE5.0以后沿用了C语言库函数中的printf方法,例如调用
System.out.printf("%8.2f",x);
可以用8个字符的宽度和小数点后两个字符的精度去打印x。也就是说,打印输出一个空格和7个字符,如下所示:
3333.33
用printf也可以使用多个参数,例如:
System.out.printf("Hello,%s.Next year,you'll be %d",name,age);
每一个以%字符开始的格式说明符都用相应的参数替换。格式说明符尾部的转换符将指示被格式化的数值类型:f表示浮点数,s表示字符,d表示十进制整数。下表列出了所有转义符。
| 转义符 | 类型 | 举例 |
| d | 十进制数 | 159 |
| x | 十六进制数 | 9f |
| o | 八进制数 | 237 |
| f | 定点浮点数 | 15.9 |
| e | 指数浮点数 | 1.59e+01 |
| g | 通用浮点数 | |
| a | 十六进制浮点数 | 0x1.fccdp3 |
| s | 字符串 | Hello |
| c | 字符 | H |
| b | 布尔 | true |
| h | 散列码 | 42628b2 |
| tx | 日期时间 | .... |
| % | 百分号 | % |
| n | 与平台相关行分隔符 | .... |
另外还有控制格式化输出的各种标志。例如,逗号标志增加了分组的分隔符。
System.out.printf("%,.2f",1000.0/3.0);
打印
3,333.33
可以使用多个标志,例如,"%,(.2f"使用分组的分隔符并将负数括在括号内。
下表列出所有标志:
| 标志 | 目的 | 举例 |
| + | 打印正数和负数的符号 | +3333.33 |
| 空格 | 在正数之前添加空格 | | 3333.33| |
| 0 | 数字前面补0 | 003333.33 |
| - | 左对齐 | |3333.33 | |
| ( | 将负数括在括号内 | (3333.33) |
| , | 添加分组分隔符 | 3,333.33 |
| #(对于f格式) | 包含小数点 | |
| #(对于x或0格式) | 添加前缀0x或0 | 0xcafe |
| $ | 给定被格式化的参数索引。例如,%1$d,%1$x将以十进制和十六进制格式打印第一个参数 | 159 9F |
| < | 格式化前面说明的数值。例如,%d%| 159 9F | |
可以使用s转换符格式化任意对象。对于任意实现了Formattable接口的对象都将调用formatTo方法;否则将调用toString方法,它可以将对象转为字符串。
可以使用静态的String.format方法创建一个格式化字符串,而不打印输出:
String message=String.format("Hello, %s. Next year, you'll be %d",name,age);
下表是日期和时间的转换符
| 转换符 | 类型 | 举例 |
| c | 完整的时间和日期 | Mon Feb 09 18:05:19 PST 2004 |
| F | ISO 8601 日期 | 2004-02-09 |
| D | 美国格式的日期 | 02/09/2004 |
| T | 24小时时间 | 18:05:19 |
| r | 12小时时间 | 06:05:19 pm |
| R | 24小时时间没有秒 | 18:05 |
| Y | 4位数字的年(前面补0) | 2004 |
| y | 年的后两位数字(前面补0) | 04 |
| C | 年的前两位数字(前面补0) | 20 |
| B | 月的完整拼写 | February |
| b或h | 月的缩写 | Feb |
| m | 两位数字的月(前面补0) | 02 |
| d | 两位数字的日(前面补0) | 09 |
| e | 两位数字的月(前面不补0) | 2 |
| A | 星期几的完整拼写 | Monday |
| a | 星期几的缩写 | Mon |
| j | 三位数的年中的日子(前面补0),在001到366之间 | 069 |
| H | 两位数字的小时(前面补0),在0到23之间 | 18 |
| k | 两位数字的小时(前面不补0),在0到23之间 | 18 |
| I | 两位数字的小时(前面补0),在0到12之间 | 06 |
| i | 两位数字的小时(前面不补0),在0到12之间 | 6 |
| M | 两位数字的分钟(前面补0) | 05 |
| S | 两位数字的秒(前面补0) | 19 |
| L | 三位数字的毫秒(前面补0) | 047 |
| N | 9位数字的毫微秒(前面补0) | 047000000 |
| P | 上午或下午的大写标志 | PM |
| p | 上午或下午的小写标志 | pm |
| z | 从GMT起,RFC822数字位移 | -0800 |
| Z | 时区 | PST |
| s | 从格林威治时间1970-01-01 00:00:00起的秒数 | 1078884319 |
| Q | 从格林威治时间1970-01-01 00:00:00起的毫秒数 | 1078884319047 |
从上表中可以得知,某些格式只给出了指定日期的部分信息。例如,只有日期或月份。如果需要多次对日期操作才能实现对每一部分进行格式化的目的就太笨拙了。为此,可以采用一个格式化的字符串指出要被格式化的参数索引。索引必须紧跟%后面,并以$结束。例如,
System.out.printf("%1$s %2$tB %2$te, %2$tY", "Due date:",new Date());
打印:
Due date:February 9, 2004
还可以选择使用<标志。它指示前面格式说明中的参数将被再次使用。也就是说,下列语句将产生与前面语句相同的效果。
System.out.printf("%s %tb %



