java 中常用的字符串格式化操作

3,361 阅读2分钟

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 日期。
%tH24小时制的小时,从 “00” 到 “23“。
%tk没有前导0的24小时制,从 “0” 到 “23“。
%tM带前导0的分钟,从 “00” 到“59“。
%tm带前导0的月份,从 “01” 到 “12“。
%tQ1970年1月1日00:00:00 UTC 以来的毫秒。
%tR24小时制的时间,如:“%tH:%tM“。
%tS2位数字格式的秒,从 “00” 到 “60”。 “60” 需要支持闰秒。
%tT24小时制的时分秒,如: “%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