大家好,又见面了,我是你们的朋友全栈君。
相信大家在学习 Java 语言的时候,见到的第一条输出语句,就是:
System.out.println("Hello World");
毫无疑问,该语句的作用就是将Hello World
打印到控制台,格式也非常的简单,直接按原格式输出。
但是,如果将输出的内容换成“数值”或者“日期”呢?其打印的格式是否会有什么不同的变化呢?接下来,就让咱们一起看一看在 Java 语言中,数值和日期是如何进行格式化输出的。
首先,给出代码示例:
/** * @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
方法,她可以将对象转换为字符串。
首先,给出代码示例:
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 |
F | ISO 8601 日期 | 2017-03-28 |
D | 美国格式的日期(月/日/年) | 03/28/2017 |
T | 24 小时时间 | 11:00:52 |
r | 12 小时时间 | 11:00:52 am |
R | 24 小时时间没有秒 | 11:00 |
Y | 4 位数字的年(前面补 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 个参数格式化。
最后,在此给出“ 格式说明符 ”的语法规则:
内容不多,但也希望能够对大家理解格式化输出有些帮助。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/156845.html原文链接:https://javaforall.cn