博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
格式化输出
阅读量:4050 次
发布时间:2019-05-25

本文共 3394 字,大约阅读时间需要 11 分钟。

-- Start

在 JDK 5.0 之前,我们使用NumberFormat 类来,使用 DateFormat 类来,使用MessageFormat 类来。从 JDK 5.0 开始,我们又多了一种选择,我们可以像使用 C 语言的 printf 函数一样使用 System.out.printf 方法,不过要比 C 语言的 printf 函数更强大,因为 Java 的 printf 方法还提供了本地化的支持。

下面我们来看一个简单的例子.

System.out.printf("格式化数字例子:%1$,30.6f", 9876543210.0123456789);
结果如下:

格式化数字例子:          9,876,543,210.012346
%1$,30.6f 被称为格式符(format specifier), 格式符由以下几部分组成:
%[argument_index$][flags][width][.precision]conversion%              1$      ,      30 .6         f

  • %是必须的, 任何格式符都由百分号开始.
  • argument_index是可选的, 它表示 printf 方法参数的索引, 第一个参数是1$, 第二个是2$,...
  • flags是可选的, flags 依赖于 conversion, 详见下表.
  • width是可选的, 表示输出数字的宽度.
  • precision可选的, 表示小数位数.
  • conversion是必须的, 表示如何格式化参数, 详见下表.

Java 支持如下转换符(conversion).

转换符(Conversion) 参数类型(Argument Category) 描述(Description)
b/B 任意类型 默认结果为 true
如果参数是 null, 结果为 false
如果参数是布尔型, 结果是 String.valueOf(arg)
h/H 任意类型 如果参数是 null, 结果为 null,
否则为Integer.toHexString(arg.hashCode())
s/S 任意类型 如果参数是 null, 结果为 null,
如果参数实现了 Formattable, 结果为 arg.formatTo,
否则结果为 arg.toString()
c/C char Unicode 字符
d 整数 整数
o 整数 八进制整数
x/X 整数 十六进制整数
e/E 浮点数 科学记数法
f 浮点数 浮点数
g/G 浮点数 浮点数或科学记数法取决于小数位数
a/A 浮点数 十六进制浮点数
t/T 日期和时间 格式化日期和时间的前缀,后缀见下表
% 百分号 %
n 换行符 与平台相关的换行符

日期和时间转换符(后缀)

转换符(Conversion) 描述(Description)
H 小时,00-23
k 小时,0-23
I 小时,01-12
l 小时,1-12
M 分钟,00-59
S 秒,00-60
L 毫秒,000-999
N 纳秒,000000000 - 999999999
P 本地敏感, PM or AM
p 本地敏感,pm or am
z 时区偏移量, 如 +0800
Z 时区
s 从格林威治时间1970-01-01 00:00:00起的秒数
Q 从格林威治时间1970-01-01 00:00:00起的毫秒数
B 本地敏感,月的完整拼写
b/h 本地敏感,月的缩写
A 本地敏感,星期的完整拼写
a 本地敏感,星期的缩写
Y 4位数字的年(前面补0)
y 年的后两位数字(前面补0)
C 年的前两位数字(前面补0)
j 一年的第几天,001-366
m 月, 01-13
d 日,01-31
e 日,1-31
R 24小时时间,如 18:05
T 24小时时间,如 18:05:19
r 12小时时间, 如 06:05:19 pm
D 美国格式的日期(月/日/年),如 02/09/2004
F ISO 8601 日期, 如 2004-02-09
c 完整的日期和时间,如 Mon Feb 09 18:05:19 PST 2004

Java 支持如下标志(flag)

标志 描述 举例
- 左对齐 |3333.33 |
#(对于f格式) 包含小数点 3333.
#(对于x或0格式) 添加前缀0x或0 0xcafe
+ 打印正数数和负数的符号 +3333.33
空格 在正数之前添加空格 | 3333.33|
0 数字前面补0 003333.33
, 本地敏感,添加千分位 3,333.33
( 将负数括在括号内 (3333.33)

下面是一个简单的例子.

public static void main(String[] args) {	Calendar c = Calendar.getInstance();	System.out.println("格式化整数");	System.out.printf(Locale.CHINA, "中国: %,d%n", 987654321);	System.out.printf(Locale.GERMAN, "德国: %,d%n", 987654321);	System.out.println("\n\n格式化浮点数");	System.out.printf(Locale.CHINA, "中国: %,.2f%n", 987654321.123456789);	System.out.printf(Locale.GERMAN, "德国: %,.2f%n", 987654321.123456789);	System.out.println("\n\n格式化日期和时间");	System.out.printf(Locale.CHINA, "中国: %tc%n", c);	System.out.printf(Locale.GERMAN, "德国: %tc%n", c);	System.out.printf(Locale.CHINA, "中国: %tF%n", c);	System.out.printf(Locale.GERMAN, "德国: %tF%n", c);	System.out.printf(Locale.CHINA, "中国: %1$tY/%1$tm/%1$td%n", c);	System.out.printf(Locale.GERMAN, "德国: %1$tY/%1$tm/%1$td%n", c);	System.out.println("\n\n格式化消息");	System.out.printf("你好,%n我叫 %1$s.%n我的生日是 %2$tF.%n", "尚波", c);}
结果如下:

格式化整数中国: 987,654,321德国: 987.654.321格式化浮点数中国: 987,654,321.12德国: 987.654.321,12格式化日期和时间中国: 星期一 五月 21 17:05:47 GMT+08:00 2012德国: Mo Mai 21 17:05:47 GMT+08:00 2012中国: 2012-05-21德国: 2012-05-21中国: 2012/05/21德国: 2012/05/21格式化消息你好,我叫 尚波.我的生日是 2012-05-21.
从中我们可以看到, 有部分转换符是本地敏感的, 如: 星期名, 月份名, 千分位等.

上面的例子中, 我们将格式化的结果输出到标准输出流, 我们还可以

  • 使用 System.err.printf(), 将格式化的结果输出到标准错误输出流.
  • 使用 String.format(), 将格式化的结果保存到一个String变量中.
  • 使用 Formatter类, 我们可以将格式化的结果输出到文件, 输出流等, 或添加到 StringBuilder, StringBuffer等.

---更多参见:

-- 声 明:转载请注明出处
-- Last Updated on 2012-05-21
-- Written by ShangBo on 2012-04-26
-- End

你可能感兴趣的文章
函数模版类模版和偏特化泛化的总结
查看>>
VMware Workstation Pro虚拟机不可用解决方法
查看>>
最简单的使用redis自带程序实现c程序远程访问redis服务
查看>>
redis学习总结-- 内部数据 字符串 链表 字典 跳跃表
查看>>
iOS 对象序列化与反序列化
查看>>
iOS 序列化与反序列化(runtime) 01
查看>>
iOS AFN 3.0版本前后区别 01
查看>>
iOS ASI和AFN有什么区别
查看>>
iOS QQ侧滑菜单(高仿)
查看>>
iOS 扫一扫功能开发
查看>>
iOS app之间的跳转以及传参数
查看>>
iOS __block和__weak的区别
查看>>
Android(三)数据存储之XML解析技术
查看>>
Spring JTA应用之JOTM配置
查看>>
spring JdbcTemplate 的若干问题
查看>>
Servlet和JSP的线程安全问题
查看>>
GBK编码下jQuery Ajax中文乱码终极暴力解决方案
查看>>
Oracle 物化视图
查看>>
PHP那点小事--三元运算符
查看>>
解决国内NPM安装依赖速度慢问题
查看>>