C语言中printf()格式化输出功能很是方便,Java在 Java SE5也推出了类似的功能,方便开发者闪电输出想要的格式和排列。

知识背景

最近在做PCF项目,需要将数据库里的数据拿出来,按照交易所指定的格式输出到文件中去,例如要求小数点保留6位;属性长度固定为30,不足的留空格;部分属性左对齐等等。幸好Java有输出利器,不用怕啦!

格式化输出的示例

1
2
3
4
5
6
7
8
9
Formatter formatter = new Formatter(System.out);
formatter.format("10 %%5d :%5d\n", 10);
formatter.format("a %%c :%c\n", 'a');
formatter.format("Like %%c :%S\n", "Like");
formatter.format("false %%b :%b\n", "false");
formatter.format("13.56 %%6.4f :%6.4f\n", 13.56);
formatter.format("1548.7%%e :%e\n", 1548.7);
formatter.format("9687 %%x :%x\n", 9687);
formatter.format("9687 %%h :%h\n", 9687);

输出如下:

1
2
3
4
5
6
7
8
10    %5d    :   10
a %c :a
Like %c :LIKE
false %b :true
13.56 %6.4f :13.5600
1548.7%e :1.548700e+03
9687 %x :25d7
9687 %h :25d7

格式化输出的方法

这里总结了三种Java自带的格式化输出方法:

  1. 最常用的便是System.out.format()方法,也可叫System.out.printf()方法,这两个的作用是一样的,只不过方法名不同

  2. 最全面的是使用java.util.Formatter类的format()方法来格式化。在构造Formatter时就需要传入一个流参数,告知它你要讲格式化后的数据输出到哪里,这个流可以是File对象,或者是OutputStream对象

  3. 最便捷的是使用String.format()方法来格式化。无需构造对象,随时可用,调用即返回String对象,非常方便

格式化输出的参数格式

在使用格式化方法的过程中,最重要的就是能够清楚如何写出你想要的参数格式,完整的格式如下:

1
%[argument_index$][flags][width][.precision]conversion
  • argument_index$:表示参数在参数列表中的位置,第一个参数就是1$,第二个就是2$
  • flags:修改输出格式的标志
  • width:表示要输出字符的最小长度
  • precision:用来限定最大长度,对不同类型行为不同
  • conversion:要转换成的具体格式

完整的格式如:%1$+5.4f

conversion类型(常用)

类型 含义 举例 可用类型
d 整数型(十进制) 13 整数
c,C Unicode字符 ‘a’ 字符
b,B Boolean值 true 通用
s,S 字符串 Like 通用
f 浮点数(十进制) 24.780000 浮点型
e,E 浮点数(科学计数) 1.45e+05 浮点型
x,X 整数(十六进制) 25d7 整数
h,H 散列码(十六进制) 25d7 通用
% 普通%字符 %

对可用类型之外的类型使用格式化会报IllegalFormatConversionException

大写类型输出的字母就都是大写

flags类型

Flag 通用 字符 整形 浮点型 日期/时间 描述
‘-‘ y y y y y 结果左对齐
‘#’ y1 - y3 y - 如果是浮点型则包含小数点;如果是16进制或8进制则添加0x或0
‘+’ - - y4 y - 结果带正负号
‘ ‘ - - y4 y - 在结果前面加指定数量的空格
‘0’ - - y y - 在结果前面加指定数量的0
‘,’ - - y2 y5 - 对特定转换的分隔符
‘(‘ - - y4 y5 - 将负数使用括号包裹

1 依赖于特定转换类型

2 仅可对’d’使用

3 仅可对’o’,’x’,’X’使用

4 对’d’, ‘o’, ‘x’, 和’X’来说可用于BigInteger;对’d’来说可用于byte、byte、short、Short、int和Integer、long和Long

5 仅可对’e’, ‘E’, ‘f’, ‘g’和 ‘G’使用

日期/时间常用格式

格式 含义
‘R’ 24小时制的时分 “%tH:%tM”
‘T’ 24小时制的时分秒 “%tH:%tM:%tS”
‘r’ 12小时制的时分秒 上午下午 “%tI:%tM:%tS %Tp”
‘D’ 年/月/日”%tm/%td/%ty”
‘F’ 年-月-日 “%tY-%tm-%td”.
‘c’ 全日期时间”%ta %tb %td %tT %tZ %tY”, 例如 “Sun Jul 20 16:17:00 EDT 1969”.

参考文献