java格式化----java.util.Formatter

来源:互联网 发布:淘宝优惠券秒杀系统 编辑:程序博客网 时间:2024/05/22 12:03

java.util.Formatter

在java中我们格式化一个字符串的方法有很多,最基本的就是不断地用+号来加出一个String,但是这样的操作有很多的问题,而且有的时候也非常的不方便,这个时候我们就要用到其他的工具。类似C的printf的格式方法,在java中也是有的,写成System.out.printf();还有另外一种方法就是使用Formatter类,这个类可以说是功能强大,能格式化任何信息。时间类可以参见我的另外一篇博文用SimpleDateFormat来格式化。

(一) 模型结构

%[argument_index$][flags][width][.precision]conversion

Eg:(“%4$2s %3$2s %2$2s %1$2s”, “a”, “b”, “c”, “d”) // -> ” d c b a”

相信只要是讲Formatter的就会一上来吧这句格式抛出来,再将一些玄学的东西,让新手彻底的看蒙,我发现说的越少效果才能越好,那我就什么都不说了,下面用五个点来吧上面的这句格式逐条分析。

(二) argument_index$ 参数序号

这个单词表示的是参数的序号,在这个表示参数的位数的数字表示之前需要加上一个$符号。比如,$2表示在参数列表中的第二个参数用来替换这个位置的内容。这个序号不是必须写的值,如果不写参数序号那么就默认为按照顺序的参数列表。

(三) flags 标志

可选的属性,如果不选的话默认没有,主要有以下这些可选内容:

标记 含义 示例 - 结果将是左对齐的。 %-4d 宽度最小为四位并且左对齐 # 如果是浮点数则结果加小数点,十六进制和八进制分别加0x和0 %#x 最后输出结果变为16进制并且加0x + 正数数字会额外显示一个+号 %+d 结果如果是证书则显示+号 一个空格 对于正值,结果中将包括一个前导空格 % d 如果结果是正数则在前面加个空格 0 结果将用零来填充 %010d 所有宽度不满10位的数字填充前导0 , 结果将包括特定于语言环境的组分隔符 %,d 每三位数字来个逗号,看起来清晰 ( 结果将是用圆括号括起来的负数 %(d 如果结果是负数,不写符号而是用()括起来

(四) width 宽度

宽度是可选属性,如果不写的话就默认宽度,如果写的话最好和flags一起配合使用,但是一定要注意宽度如果写了不能为0,否则会报错。

Eg: %-4d 宽度最小为四位并且左对齐

(五) .precision 小数位数

可选属性,这个和c语言中的做法很像,如果有浮点数的操作,则使用这个属性可以保证精度。

Eg:%.5f 保留这个浮点数小数点后五位数字

(六) conversion 格式类型

这是一个必选的参数,就是刚才我们在所有例子中都用到的参数,用这个来确定被格式内容的类型,如果类型不同会报错,先看一下所有类型的表:

转换 参数类别 说明 ‘b’ ‘B’ 常规 如果参数 arg 为 null,则结果为 “false”。如果 arg 是一个 boolean 值或 Boolean,则结果为 String.valueOf() 返回的字符串。否则结果为 “true”。 ‘h’ ‘H’ 常规 如果参数 arg 为 null,则结果为 “null”。否则,结果为调用 Integer.toHexString(arg.hashCode()) 得到的结果。 ‘s’ ‘S’ 常规 如果参数 arg 为 null,则结果为 “null”。如果 arg 实现 Formattable,则调用 arg.formatTo。否则,结果为调用 arg.toString() 得到的结果。 ‘c’ ‘C’ 字符 结果是一个 Unicode 字符 ‘d’ 整数 结果被格式化为十进制整数 ‘o’ 整数 结果被格式化为八进制整数 ‘x’ ‘X’ 整数 结果被格式化为十六进制整数 ‘e’ ‘E’ 浮点 结果被格式化为用计算机科学记数法表示的十进制数 ‘f’ 浮点 结果被格式化为十进制数 ‘g’ ‘G’ 浮点 根据精度和舍入运算后的值,使用计算机科学记数形式或十进制格式对结果进行格式化。 ‘a’ ‘A’ 浮点 结果被格式化为带有效位数和指数的十六进制浮点数 ‘t’ ‘T’ 日期时间 日期和时间转换字符的前缀。请参阅日期/时间转换。 ‘%’ 百分比 结果为字面值 ‘%’ (‘\u0025’) ‘n’ 行分隔符 结果为特定于平台的行分隔符

(七)Formatter构造器

Formatter类的构造函数有很多,但是无非是几个参数的不同组合,总结起来参数有以下这些:

1. Formatter()  无参数,构造一个新 formatter。2. Formatter(Appendable a, Locale l)  构造一个带指定目标文件(new StringBuilder)和语言环境的新 formatter。3. Formatter(File file, String csn, Locale l)   构造一个带指定文件、字符集和语言环境的新 formatter。4. Formatter(String fileName, String csn, Locale l)  构造一个带指定文件名、字符集和语言环境的新 formatter。5. Formatter(OutputStream os, String csn, Locale l)   构造一个带指定输出流、字符集和语言环境的新 formatter。

上述这些构造器中,我们较为常用的是第一个和第二个或者根据特殊的用途,后几个也会被用到。

(八)format方法

在Formatter类中最常用也是只能用的方法,,就是format,这个函数有两种参数格式:
第一种是:format(Locale l, String format, Object… args)
使用指定的语言环境、格式字符串和参数,将一个格式化字符串写入此对象的目标文件中。
第二种是:format(String format, Object… args)
使用指定格式字符串和参数将一个格式化字符串写入此对象的目标文件中。
语言环境如果有需要的时候会用到,那么我们在这里就只讨论第二种。

直接来个例子:

 StringBuilder sb = new StringBuilder();// Send all output to the Appendable object sbFormatter formatter = new Formatter();formatter.format("%4$2s %3$2s %2$2s %1$2s", "a", "b", "c", "d");formatter.format(Locale.FRANCE, "e = %+10.4f", Math.E);

不知道为什么,我的MyEclipse中这两句话总是报错,估计是我的ide的问题,这两句格式化应该是没问题的,如果你的ide也会报错可以把这两句的格式改成这样:

Object[] obj = {"a", "b", "c", "d"};formatter.format("%4$2s %3$2s %2$2s %1$2s", obj);

把第二个参数最直接的改成Object对象,绝对没问题,那么这两个的输出结果是:

d c b a
e = +27183

(九)总结

Formatter是广泛被用到的格式化方法,它能让一些东西变得更加有规范,很多超市小票,信息单,用这个方法来格式化就显得很不错,平时也应该多加练习这个方法。

1 0