• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
jwcat313
博客园    首页    新随笔    联系   管理    订阅  订阅
Java核心技术卷1 第三章选读 其二

前言

本文内容选自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 给出了格式说明符的语法图。

posted on 2024-12-17 12:11  九尾猫313  阅读(25)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3