Java 格式化输出

可以使用 System.out.println() 将数值输出到控制台。如下列语句,但是这条语句会将 x 类型所允许的最大非 0 数位个数打印输出 x。

double x = 10000.0 / 3;

System.out.println(x); // 打印 3333.3333333333335

在实际应用中(例如现实元、角和分)显示是有问题的。Java 5 沿用了 C 语言函数中的 printf 方法。

double x = 10000.0 / 3;
System.out.printf("%8.2f", x); // 打印 " 3333.33"

会以一个字段宽度(field width)打印 x: 包括 8 个字符,另外精度为小数点后 2 个字符。会打印一个前导的空格和 7 个字符。

printf 方法提供了多个参数
System.out.printf("你好,%s。明年就 %d 岁了。", name, age);
每一个以 % 字符开始的格式说明符都用相应的参数替换。格式说明符尾部的转换符指示要格式化的数值的类型。

用于 printf 的转换符

转换符 类型 举例
d 十进制整数 159
x 十六进制整数 9f
o 八进制整数 237
f 定点浮点数 15.9
e 指数浮点数 1.59e+01
g 通用浮点数(e 和 f 中较短的一个)
a 十六进制浮点数 0x1.fccdp3
s 字符串 Hello
c 字符 H
b 布尔 True
h 散列码 42628b2
tx 或 Tx 日期时间(T 强制大写) 已经过时,应当改为使用 java.time 类
% 百分号 %
n 与平台有关的行分隔符

可以给出控制格式化输出的各种标志。例如,逗号标志增加了分组的分隔符。

double x = 10000.0 / 3;
System.out.printf("%,.2f", x); // 打印  3,333.33

用于 printf 的标志

标志 目的 举例
+ 打印正数和负数的符号 +3333.33
空格 在正数之前添加空格 | 3333.33|
0 数字前面补 0 003333.33
- 左对齐 |3333.33 |
( 将负数括在括号内 (3333.33)
, 添加分组分隔符 3,333.33
# (对于 f 格式) 包含小数 3,3333.
# (对于 x 或 0 格式) 添加前缀 0x 或 0 0xcafe
$ 给定被格式化的参数索引。例如,%1$d, %1$x 将以十进制和十六进制格式打印第一个参数 159 9F
< 格式化前面说明的数值。例如,%d%<x 以十进制和十六进制打印同一个值 159 9F

可以使用 s 转换符格式化任意的对象。对于任意实现了 Formattable 接口的对象都将调用 formatTo 方法;否则将调用 toString 方法,toString 方法可以将对象转换为字符串。

可以使用静态的 String.format 方法创建一个格式化的字符串,而不打印输出:
String message = String.format("你好,%s。明年就 %d 岁了。", name, age);

下面介绍 printf 方法中日期与时间的格式化选项。格式化包括以 t 开始。

日期和时间的转换符

转换符 类型 举例
c 完整的日期和时间 星期二 八月 29 13:23:13 CST 2017
F ISO 8601 日期 2017-08-29
D 美国格式日期(月/日/年) 08/29/17
T 24 小时时间 13:23:13
r 12 小时时间 01:23:13 下午
R 24 小时时间没有秒 13:23
Y 4 位数字的年(前面补 0) 2017
y 年的后两位数字(前面补 0) 17
C 年的前两位数字(前面补 0) 20
B 月的完整拼写 八月
b 或 h 月的缩写 八月
m 两位数字的月(前面补 0) 08
d 两位数字的日(前面补 0) 09
e 两位数字的日(前面不补 0) 9
A 星期几的完整拼写 星期二
a 星期几的缩写 星期二
j 三位数的年中的日子(前面补 0),在 001 到 366 之间 241
H 两位数字的小时(前面补 0),在 0 到 23 之间 13
k 两位数字的小时(前面不补 0),在 0 到 23 之间 13
I 两位数字的小时(前面补 0),在 0 到 12 之间 01
l 两位数字的小时(前面不补 0),在 0 到 12 之间 1
M 两位数字的分钟(前面补 0) 23
S 两位数字的秒(前面补 0) 13
L 三位数字的毫秒(前面补 0) 740
N 九位数字的毫微秒(前面补 0) 740000000
p 上午或下午的标志 下午
z 从 GMT 起,RFC822 数字位移 +0800
Z 时区 CST
s 从格林威治时间 1970-01-01 00:00:00 起的秒数 1503984193
Q 从格林威治时间 1970-01-01 00:00:00 起的毫秒数 1503984193740

可以使用一个格式字符串指示要格式化的参数索引。索引必须紧跟在 % 后面,并以 $ 终止。

System.out.printf("%1$s %2$tY-%2$tm-%2$td %2$tH:%2$tM:%2$tS.%2$tN", "北京时间: ", new Date());
// 打印 北京时间:  2020-08-27 20:02:56.902000000

参数索引从 1 开始,而不是从 0 开始,%1$... 对第 1 个参数格式化。

还可以选择使用 < 标志。它指示前面格式说明中的参数将被再次使用。下列语句将产生与前面语句同样的输出结果:

System.out.printf("%s %tY-%<tm-%<td %<tH:%<tM:%<tS.%<tN", "北京时间: ", new Date());
// 打印 北京时间:  2020-08-27 21:49:47.772000000
格式说明符语法
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,843评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,538评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,187评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,264评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,289评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,231评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,116评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,945评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,367评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,581评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,754评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,458评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,068评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,692评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,842评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,797评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,654评论 2 354