前言
本文内容选自Java核心技术卷1 第10版,感兴趣的小伙伴可以自行阅读原书,以下内容为本人学习后摘取的片段与大家分享。
正文
3.7.2 格式化输出
可以使用 SyStem.0Ut.print(x) 将数值 x 输出到控制台上。这条命令将以 x 对应的数据类型
所允许的最大非 0 数字位数打印输出 X。
例如:
double x = 10000.0 / 3.0;
System.out.print(x);
打印
3333.3333333333335
如果希望显示美元、美分等符号, 则有可能会出现问题。
在早期的 Java 版本中,格式化数值曾引起过一些争议。庆幸的是,Java SE 5.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 SSd", 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或Tx | 日期时间(T 强制大写) | 已经过时,应当改为使用java.time类 |
% | 百分号 | % |
n | 与平台有关的行分隔符 | —— |
笔者使用Java 8进行举例演示
System.out.printf("%d",159);// 159
System.out.println();
System.out.printf("%x",159);// 9f
System.out.println();
System.out.printf("%o",159);// 237
System.out.println();
System.out.printf("%f",15.9);// 15.900000
System.out.println();
System.out.printf("%e",15.9);// 1.590000e+01
System.out.println();
System.out.printf("%a",15.9);// 0x1.fcccccccccccdp3
System.out.println();
System.out.printf("%s","Hello");// Hello
System.out.println();
System.out.printf("%c",'H');// H
System.out.println();
System.out.printf("%b",true);// true
System.out.println();
System.out.printf("%h","159");// be95
System.out.println();
System.out.printf("%td",new Date());// 17,当前日期的“日”
System.out.printf("%n");// 输出空行即一个行分隔符
另外,还可以给出控制格式化输出的各种标志。下表列出了所有的标志。例如,逗号
标志增加了分组的分隔符。 即
Systen.out.printf("%,.2f", 10000.0 / 3.0);
打印
3,333.33
可以使用多个标志,例如,"%,(.2f" 使用分组的分隔符并将负数括在括号内。
System.out.printf("%,(.2f", -10000.0 / 3.0);// (3,333.33)
标志 | 目的 | 举例 |
---|---|---|
+ | 打印正数和负数的符号 | +3333.33 |
空格 | 在正数之前添加空格 | | 3333.33| |
0 | 数字前面补0 | 003333.33 |
- | 左对齐 | |3333.33 | |
( | 将负数括在括号内 | (3333.33) |
, | 添加分组分隔符 | 3,333.33 |
#(对于f格式) | 包含小数点 | 3,333. |
#(对于x或0格式) | 添加前缀0x或0 | 0xcafe |
$ | 给定被格式化的参数索引。例如,%1$d,%1$x将以十进制和十六进制格式打印第一个参数 | 159 9F |
< | 格式化前面说明的数值。例如,%d%<x以十进制和十六进制打印同一个数值 | 159 9F |
笔者使用Java 8举例演示
System.out.printf("%+.2f", 3333.33);// +3333.330000
System.out.println();
System.out.printf("|% .2f|", 3333.33);// | 3333.33|
System.out.println();
System.out.printf("%09.2f", 3333.33);// 003333.33
System.out.println();
System.out.printf("|%-9.2f|", 3333.33);// |3333.33 |
System.out.println();
System.out.printf("%(.2f", -3333.33);// (3333.33)
System.out.println();
System.out.printf("%,.2f", 3333.33);// 3,333.33
System.out.println();
System.out.printf("%#f", 3333f);// 3333.000000
System.out.println();
System.out.printf("%#x", 0xcafe);// 0xcafe
System.out.println();
System.out.printf("%1$d,%1$x", 159);// 159,9f
System.out.println();
System.out.printf("%d,%<x", 159);// 159,9f
可以使用静态的 String.format 方法创建一个格式化的字符串, 而不打印输出:
String message = String.format("Hello, %s. Next year, you'll be %d", name , age);
基于完整性的考虑,下面简略地介绍 printf方法中日期与时间的格式化选项。在新代码中,应当使用卷 II 第 6 章中介绍的java.time 包的方法。不过你可能会在遗留代码中看到 Date 类和相关的格式化选项。格式包括两个字母,以 t 开始,以表 3-7 中的任意字母结束。
例如,
System.out.printf("%tc", new Date());
这条语句将用下面的格式打印当前的日期和时间:
Mon Feb 09 18:05:19 PST 2015
转换符 | 类型 | 举例 |
---|---|---|
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 可以看到, 某些格式只给出了指定 丨期的部分信息 t 。例如, 只有 FI 期 或 月 份 如
果需要多次对口期操作才能实现对每一部分进行格式化的 Q 的就太笨拙了为此, 可以采用一
个格式化的字符串指出要被格式化的参数索引。索引必须紧跟在 % 后面, 并以 $ 终止。 例如,
System.out.printf("%1$s %2$tB %2$te, %2$tY", "Due date:", new Date());
打印
Due date: February 9, 2015
还可以选择使用 < 标志它指示前而格式说明中的参数将被再次使用。也就是说,下列语句将产生与前面语句同样的输出结果:
System.out.printf("%s %tB %<te, %<tY", "Due date:", new Date());
提示:参教索引值从 1 开始,而不是从 0 开始,对第 1 个参数格式化这就避免了与 0 标志混淆
现在,已经了解了 printf 方法的所有特性。图 3-6 给出了格式说明符的语法图。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix