java 里常用的几个格式化的方法
String.format(str, Object...);
System.out.printf(str, Object...);
System.outr.format(str, Object...);
// 底层的实现都是通过 new Formatter().format(str, Object...) 实现
String.format 实现
public static String format(String format, Object... args) {
return new Formatter().format(format, args).toString();
}
System.out.printf 实现
// 内部调用 System.out.format
System.outr.format 实现
public PrintStream format(String format, Object ... args) {
try {
synchronized (this) {
ensureOpen(); // 确认流未关闭
if ((formatter == null)
|| (formatter.locale() != Locale.getDefault()))
formatter = new Formatter((Appendable) this);
formatter.format(Locale.getDefault(), format, args);
}
} catch (InterruptedIOException x) {
Thread.currentThread().interrupt();
} catch (IOException x) {
trouble = true;
}
return this;
}
格式说明符
| 说明符 | 适用于 | 输出 |
|---|---|---|
| %a | 浮点数 (除了BigDecimal) | 浮点数的十六进制输出 |
| %b | 任何类型 | 如果为非空则为“true”,为空则为“false” |
| %c | 字符 | Unicode字符 |
| %d | 证书(包括byte, short, int, long, bigint) | 十进制整数 |
| %e | 浮点数 | 科学计数的十进制数 |
| %f | 浮点数 | 十进制数 |
| %g | 浮点数 | 十进制数,根据值和精度可能以科学计数法显示 |
| %h | 任何类型 | 通过hashCode()方法输出的16进制数 |
| %n | 无 | 平台相关的换行符 |
| %o | 整数(包括byte, short, int, long, bigint) | 八进制数 |
| %s | 任何类型 | 字符串 |
| %t | 日期/时间 (包含long, Calendar, Date 和TemporalAccessor) | %t是日期/时间转换的前缀。后面还需要跟其他的标识,请参考下面的日期/时间转换。 |
| %x | 整数(包含byte, short, int, long, bigint) | 十六进制字符串 |
| 标识 | 注释 |
|---|---|
| %tc | 日期和时间的格式为 “%ta %tb %td %tT %tZ %tY” 如 “Fri Feb 17 07:45:42 PST 2017“。 |
| %tD | 格式为 “%tm/%td/%ty“ 的日期。 |
| %td | 两位的日期格式,从 “01”到 “31“。 |
| %tF | 使用 “%tY-%tm-%td“ 格式的 ISO 8601 日期。 |
| %tH | 24小时制的小时,从 “00” 到 “23“。 |
| %tk | 没有前导0的24小时制,从 “0” 到 “23“。 |
| %tM | 带前导0的分钟,从 “00” 到“59“。 |
| %tm | 带前导0的月份,从 “01” 到 “12“。 |
| %tQ | 1970年1月1日00:00:00 UTC 以来的毫秒。 |
| %tR | 24小时制的时间,如:“%tH:%tM“。 |
| %tS | 2位数字格式的秒,从 “00” 到 “60”。 “60” 需要支持闰秒。 |
| %tT | 24小时制的时分秒,如: “%tH:%tM:%tS“。 |
测试样例:
指定宽度:
String.format("|%20d|", 93);
// 输出:| 93|
指定宽度内的左对齐:
String.format("|%-20d|", 93);
// 输出:|93 |
用零填充:
String.format("|%020d|", 93);
// 输出:|00000000000000000093|
使用和区域相关的千位分隔符 ,:
String.format("|%,d|", 10000000);
// 输出:|10,000,000|
指定最大字符数
String.format("|%.5s|", "Hello World");
// 输出:|Hello|
"%tc "相当于 "%ta %tb %td %tT %tZ %tY ”,而且不需要自己指定索引。
String.format("%tc", new Date());
// 输出:星期日 四月 16 08:21:59 CST 2017
如果想要通过具体标识手动指定成上面的效果,需要增加索引。
String.format("%1$ta %1$tb %1$td %1$tT %1$tZ %1$tY", new Date());
// 输出:星期日 四月 16 08:24:06 CST 2017