详述 Java 语言中的格式化输出

1 前言

相信大家在学习 Java 语言的时候,见到的第一条输出语句,就是:

System.out.println("Hello World");

毫无疑问,该语句的作用就是将Hello World打印到控制台,格式也非常的简单,直接按原格式输出。

但是,如果将输出的内容换成“数值”或者“日期”呢?其打印的格式是否会有什么不同的变化呢?接下来,就让咱们一起看一看在 Java 语言中,数值和日期是如何进行格式化输出的。

2 数值

首先,给出代码示例:

/**
 * @author 维C果糖
 * @create 2017-03-28-上午9:45
 */

public class SysDemo {
    public static void main(String[] args) {
        double d = -12345.678;
        System.out.printf("%6.2f" , d);
        System.out.println();
        System.out.printf("%,(.2f" , d);
        System.out.println();
        System.out.printf("%,6.1f" , d);
        System.out.println();
        System.out.printf("%s" , d);        // 转换成字符串
        System.out.println();
        System.out.printf("%h" , d);        // 转换成散列码
    }
}

运行上述代码,结果如下图所示:

这里写图片描述

如上图所示,以输出第一个结果的代码为例,%6.2f表示除符号位外,共6+2=8个字符的宽度,以及小数点后两个字符的精度打印数值。其中,每一个以%字符开始的格式说明符都用相应的参数进行替换,格式说明符尾部的转换符表示被格式化的数值类型,例如f就表示浮点数。下面,列出常用的转换符:

转换符类型举例
d十进制整数250
f定点浮点数12.3
s字符串hello
c字符a
b布尔型true
h散列码87c258e

此外,如第二个输出结果所示,还有用于printf函数的标记。下面列出常见的标记:

标记目的举例
+打印正数和负数的符合+12345.6
(将负数括在括号内(12345.68)
添加分组分隔符12,345.7
0数字前面用 0 补位00123.45

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

3 日期

首先,给出代码示例:

import java.util.Date;

/**
 * @author 维C果糖
 * @create 2017-03-28-上午10:20
 */

public class SysDemo {
    public static void main(String[] args) {
        System.out.printf("%tc", new Date());
        System.out.println();
        System.out.printf("%tF", new Date());
        System.out.println();
        System.out.printf("%tT", new Date());
        System.out.println();
        System.out.printf("%tQ", new Date());
    }
}

运行上述代码,结果如下图所示:

这里写图片描述

如上图所示,以输出第一个结果的代码为例,%tc表示输出完整的日期和时间。在这里,使用以t开始,以下表中任意字母结束的两个字母格式,此外,下面基本全部列出了关于日期与时间的转换符:

转换符类型举例
c完整的日期和时间星期二 三月 28 11:00:52 CST 2017
FISO 8601 日期2017-03-28
D美国格式的日期(月/日/年)03/28/2017
T24 小时时间11:00:52
r12 小时时间11:00:52 am
R24 小时时间没有秒11:00
Y4 位数字的年(前面补 0)2017
y年的后两位数字(前面补 0)17
C年的前两位数字(前面补 0)20
B月的完整拼写March
b 或者 h月的缩写Mar
m两位数字的月(前面补 0)03
d两位数字的日(前面补 0)28
e两位数字的月(前面不补 0)3
A星期几的完整拼写Monday
a星期几的缩写Mon
j三位数中的年的日(前面补 0),在 0001 到 366 之间087
H两位数字的小时(前面补 0),在 0 到 23 之间11
k两位数字的小时(前面不补 0),在 0 到 23 之间11
M两位数字的分钟(前面补 0)26
S两位数字的秒(前面补 0)17
L三位数字的毫秒413
N九位数字的毫微秒413000000
P上午或下午的大写标志AM
p上午或下午的小写标志am
z从 GMT 起,RFC822 数位位移+0800
Z时区CST
s从格林威治时间 1970-01-01 00:00:00 起的秒数1490671516
Q从格林威治时间 1970-01-01 00:00:00 起的毫秒数1490670052093

从上表中可以看出来,有些格式只给出了指定日期的部分信息,例如只给出月份或者日期。如果需要多次对日期操作才能实现对每一部分日期进行格式化的目的就太 low 啦!因此,咱们可以采用一个格式化的字符串,指出要被格式化的“参数索引”。索引必须紧跟在%的后面,并以$终止。例如,

System.out.printf("%1$s %2$tB %2$te %2$tY","Due Date:",new Date());

其输出结果为:

这里写图片描述

咱们可以选择使用<标志,她表示前面格式说明中的参数将被再次使用。也就是说,下面的代码将产生与前面语句同样的输出结果:

System.out.printf("%s %tB %<te %<tY","Due Date:",new Date());

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


最后,在此给出“ 格式说明符 ”的语法规则:

这里写图片描述

内容不多,但也希望能够对大家理解格式化输出有些帮助。

  • 7
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CG国斌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值