3.7.2 格式化输出
可以使用System.out.print(x)将数值x输出到控制台上。这条命令将以x对应的数据类型所允许的最大非0数字位数打印输出x。例如:
打印
如果希望显示美元、美分等符号,则有可能会出现问题。
在早期的Java版本中,格式化数值曾引起过一些争议。庆幸的是,Java SE 5.0沿用了C语言库函数中的printf方法。例如,调用
可以用8个字符的宽度和小数点后两个字符的精度打印x。也就是说,打印输出一个空格和7个字符,如下所示:
在printf中,可以使用多个参数,例如:
每一个以%字符开始的格式说明符都用相应的参数替换。格式说明符尾部的转换符将指示被格式化的数值类型:f表示浮点数,s表示字符串,d表示十进制整数。表3-5列出了所有转换符。
表3-5 用于printf的转换符
转换符 类 型 举 例 转换符 类 型 举 例
d 十进制整数 159 s 字符串 Hello
x 十六进制整数 9f c 字符 H
o 八进制整数 237 b 布尔 True
f 定点浮点数 15.9 h 散列码 42628b2
e 指数浮点数 1.59e+01 tx或Tx 日期时间(T强制大写) 已经过时,应当改为使用java.time类,参见卷Ⅱ第6章
g 通用浮点数 — % 百分号 %
a 十六进制浮点数 0x1.fccdp3 n 与平台有关的行分隔符 —
另外,还可以给出控制格式化输出的各种标志。表3-6列出了所有的标志。例如,逗号标志增加了分组的分隔符。即
打印
可以使用多个标志,例如,“%, ( .2f”使用分组的分隔符并将负数括在括号内。
表3-6 用于printf的标志
标 志 目 的 举 例
+ 打印正数和负数的符号 +3333.33
空格 在正数之前添加空格 | 3333.33|
0 数字前面补0 003333.33
- 左对齐 |3333.33 |
( 将负数括在括号内 (3333.33)
, 添加分组分隔符 3,333.33
#(对于f格式) 包含小数点 3,333.
#(对于x或0格式) 添加前缀0x或0 0xcafe
d,%1$x将以十进制和十六进制格式打印第1个参数 159 9F
< 格式化前面说明的数值。例如,%d%<x以十进制和十六进制打印同一个数值 159 9F
注释:可以使用s转换符格式化任意的对象。对于任意实现了Formattable接口的对象都将调用formatTo方法;否则将调用toString方法,它可以将对象转换为字符串。在第5章中将讨论toString方法,在第6章中将讨论接口。
可以使用静态的String.format方法创建一个格式化的字符串,而不打印输出:
基于完整性的考虑,下面简略地介绍printf方法中日期与时间的格式化选项。在新代码中,应当使用卷Ⅱ第6章中介绍的java.time包的方法。不过你可能会在遗留代码中看到Date类和相关的格式化选项。格式包括两个字母,以t开始,以表3-7中的任意字母结束。
例如,
这条语句将用下面的格式打印当前的日期和时间:
表3-7 日期和时间的转换符
转换符 类 型 举 例
c 完整的日期和时间 Mon Feb 09
18:05:19 PST
2015
F ISO 8601日期 2015-02-09
D 美国格式的日期(月/日/年) 02/09/2015
T 24小时时间 18:05:19
r 12小时时间 06:05:19 pm
R 24小时时间没有秒 18:05
Y 4位数字的年(前面补0) 2015
y 年的后两位数字(前面补0) 15
C 年的前两位数字(前面补0) 20
B 月的完整拼写 February
b或h 月的缩写 Feb
m 两位数字的月(前面补0) 02
d 两位数字的日(前面补0) 09
e 两位数字的日(前面不补0) 9
A 星期几的完整拼写 Monday
a 星期几的缩写 Mon
j 三位数的年中的日子(前面补0),在001到366之间 069
H 两位数字的小时(前面补0),在0到23之间 18
k 两位数字的小时(前面不补0),在0到23之间 18
I 两位数字的小时(前面补0),在0到12之间 06
l 两位数字的小时(前面不补0),在0到12之间 6
M 两位数字的分钟(前面补0) 05
S 两位数字的秒(前面补0) 19
L 三位数字的毫秒(前面补0) 047
N 九位数字的毫微秒(前面补0) 047000000
p 上午或下午的标志 pm
z 从GMT起,RFC822数字位移 -0800
Z 时区 PST
s 从格林威治时间1970-01-01 00:00:00起的秒数 1078884319
Q 从格林威治时间1970-01-01 00:00:00起的毫秒数 1078884319047
从表3-7可以看到,某些格式只给出了指定日期的部分信息。例如,只有日期或月份。如果需要多次对日期操作才能实现对每一部分进行格式化的目的就太笨拙了。为此,可以采用一个格式化的字符串指出要被格式化的参数索引。索引必须紧跟在%后面,并以$终止。例如,
打印
还可以选择使用<标志。它指示前面格式说明中的参数将被再次使用。也就是说,下列语句将产生与前面语句同样的输出结果:
提示:参数索引值从1开始,而不是从0开始,%1$...对第1个参数格式化。这就避免了与0标志混淆。
现在,已经了解了printf方法的所有特性。图3-6给出了格式说明符的语法图。
图3-6 格式说明符语法
注释:许多格式化规则是本地环境特有的。例如,在德国,组分隔符是句号而不是逗号,Monday被格式化为Montag。在卷Ⅱ第5章中将介绍如何控制应用的国际化行为。