C语言中printf()格式化输出功能很是方便,Java在 Java SE5也推出了类似的功能,方便开发者闪电输出想要的格式和排列。
知识背景
最近在做PCF项目,需要将数据库里的数据拿出来,按照交易所指定的格式输出到文件中去,例如要求小数点保留6位;属性长度固定为30,不足的留空格;部分属性左对齐等等。幸好Java有输出利器,不用怕啦!
格式化输出的示例
1 | Formatter formatter = new Formatter(System.out); |
输出如下:
1 | 10 %5d : 10 |
格式化输出的方法
这里总结了三种Java自带的格式化输出方法:
最常用的便是System.out.format()方法,也可叫System.out.printf()方法,这两个的作用是一样的,只不过方法名不同
最全面的是使用java.util.Formatter类的format()方法来格式化。在构造Formatter时就需要传入一个流参数,告知它你要讲格式化后的数据输出到哪里,这个流可以是File对象,或者是OutputStream对象
最便捷的是使用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”. |