前言
在java中我们格式化一个字符串的方法有很多,最基本的就是不断地用+号来加出一个String
但是这样的操作有很多的问题,而且有的时候也非常的不方便,这个时候我们就要用到其他的工具。类似C的printf的格式方法,在java中也是有的,写成System.out.printf();还有另外一种方法就是使用Formatter类,这个类可以说是功能强大,能格式化任何信息。
在学习Formatter之前,我们先学习下格式化符号
一、格式化符号
1、标识
1、-
将是左对齐的。(默认是右对齐),不可以与“用0填充”同时使用
案例
System.out.println(String.format("%-8d", 3123));3123
System.out.println(String.format("%8d", 3123));//空格 空格 空格 空格 3123
String.format("%-08d", 3123)//报错
2、#
如果是浮点数则结果加小数点,十六进制和八进制分别加0x和0只适用于8进制和16进制,8进制时在结果前面增加一个0,16进制时在结果前面增加0x
案例
System.out.println(String.format("%-#8x", 3123));//0xc33
System.out.println(String.format("%-#8o", 3123));//06063
System.out.println(String.format("%-#8d", 3123));//报错
3、+
正数前显示正号,负数前显示负号(一般情况下只适用于10进制,若对象为BigInteger才可以用于8进制和16进制)
案例
String.format("%+08d", 3123)+0003123
String.format("%+08d", -3123)-0003123
4、一个空格
正数前显示空格,负号前显示负号(一般情况下只适用于10进制,若对象为BigInteger才可以用于8进制和16进制)
案例
String.format("% 08d", -3123)-0003123
String.format("% 08d", 3123) 0003123
5、0
结果将用零来填充
案例
System.out.println(String.format("%08d", 3123));//0003123
6、,
结果将包括特定于语言环境的组分隔符
案例
String.format("%,07d", 23123)023,123
String.format("%,08d", 23123)0023,123
String.format("%,09d", 23123)00023,123
String.format("%0,9d", 23123)00023,123
String.format("%,-9d", 231111123)231,111,123
String.format("%09,d", 23123)Exception
7、(
结果将是用圆括号括起来的负数(一般情况下只适用于10进制,若对象为BigInteger才可以用于8进制和16进制)
案例
String.format("%(-9d", 20)20
String.format("%(-9d", -20)(20)
String.format("%,(-9d", -25550)(25,550)
String.format("%,(-9x", -25550)Exception
8、<
案例
System.out.println(String.format("%d%<x", 10));10a
2、整数模型结构
- 格式化公式:%[index$][标识][最小宽度]转换方式
index$:指定是第几个参数
最小宽度:转换后的整数的最小位数
标识:标识可以有多个
转换方式:
'd'(必须小写·) 整数型(十进制必须是整数 String.format("%-8d",12//12
'o'(不是零)(必须小写) 整数型(八进制)必须是整数 String.format("%-8o",12)//14
'x' 'X' 整数型(十六进制)必须是整数 String.format("%-8x",12)//c
案例
%1$-2d
百分比符号“%”是特殊格式的一个前缀。那么我们要输入一个百分比符号该怎么办呢?肯定是需要转义字符的,但是要注意的是,在这里转义字符不是“\”,而是“%”。换句话说,下面这条语句可以输出一个“12%”:
System.out.println(String.format("%1$d%%", 12));//12%
3、浮点数模型结构
浮点数的格式化公式比整数的多了一个精度,用于控制小数点后的位数。
格式化公式:%[index$][标识][最少宽度][.精度]转换方式
转换方式:
'f' 浮点型(十进制)必须是小数 //String.format("%-8.2f",12.00)12.00
'e' 'E' 浮点型(科学计数)必须是小数 //String.format("%-8.2E",12.0)1.20E+01
'g', 'G' 根据具体情况,自动选择用普通表示方式还是科学计数法方式//String.format("%-8.2g",1000.0)1.0e+03
'a', 'A' 结果被格式化为带有效位数和指数的十六进制浮点数 //String.format("%-8.2a",1.0)0x1.00p0
4、字符串模型结构
字符串格式化不能有标识,否则运行错误
格式化公式:%[index$][最少宽度][.精度]s/S
最少宽度:表明要向输出中写入的最少字符数,如果最少宽度大于字符个数,就用空格来凑,(?>=最少宽度)
精度:来限制字符数,如果其限制字符数大于原字符的个数,则输出原字符的个数(?<=精度)
System.out.println(String.format("%7.8s","aeee"));//<空格><空格><空格>aeee
System.out.println(String.format("%1.3s","aeee"));//aee
argument_index$ 参数序号
这个单词表示的是参数的序号,在这个表示参数的位数的数字表示之前需要加上一个$符号。
index表示在参数列表中的第二个参数用来替换这个位置的内容。这个序号不是必须写的值,如果不写参数序号那么就默认为按照顺序的参数列表。
%s/%S,按顺序输出,加index后可以调整输出顺序
System.out.println(String.format("%4$s,%3$s,%2$s,%1$s","a","b","c","d"));//d,c,b,a
System.out.println(String.format("%4$s%3$s%2$s%1$s","a","b","c","d"));//dcba