关于%ns(n为数字)的用法
先来看以下代码
String.format("A=%1s,B=%2s,C=%3s,D=%2s,E=%2s,F=%4s","A","B","C","DD","EEE","FFF");
对于上述代码,如果我们打印出来这个拼后的字符串,那么会看到如下格式的字符串。
A=A,B= B,C= C,D=DD,E=EEE,F= FFF
我们惊奇的发现,里边有的地方有空格,有的地方却没有空格,那么这是为什么呢?
首先对于format,定义是为了规范格式化字符串,把字符串按照一定的格式拼接完成,拼接就是将多个字符串按照顺序放在一起,但是format没有那么简单,它还可以规范拼接后的字符串的对齐方式。
format默认使用的对齐方式是右对齐,默认空位补空格。
%2s里的那个数字2代表的就是当前字符串最小长度,如果当前位置字符串长度小于2那么会对应补齐空格,如果长度超出或者正好相等,那么便不会自动补空格。所以上边对于B=%2s,拼接的字符串为"B",而当前位字符串最小长度要求为2,所以B前边会补一个空格,结果为B=[空格]B。
- 修改对齐方式 ‘’-”
format的默认对齐方式是右对齐,我们可以使用- 来修改其对齐方式为左对齐,这样他会在末尾补空格
String.format("A=%1s,B=%-2s,C=%3s,D=%2s,E=%2s,F=%4s","A","B","C","DD","EEE","FFF");
结果:
A=A,B=B ,C= C,D=DD,E=EEE,F= FFF
可以看到B=%-2s对齐方式改为了左对齐
我们现在一直试验的%ns,n为整数,有没有想过n为小数时候是什么现象呢?
看如下代码:
String.format("A=%1s,B=%-2s,C=%3.1s,D=%2s,E=%2s,F=%4s", "A", "B", "CCC", "DD", "EEE", "FFF")
注意看C=%3.1s的表现,我们看结果:
A=A,B=B ,C= C,D=DD,E=EEE,F= FFF
我们会惊奇的发现虽然我们定义了CCC去替换C=%3.1s ,但是输出结果却依然是C=[空格][空格]C。这是因为当n出现小数时候,小数点后边的数字代码当前位字符串所允许的最大长度,超出了则会从左边第一位开始截取所允许的长度的字符串。
format中除了%s还会有%d,%f。对于%d,只能中规中距的使用,否则会报异常。那么对于%f有什么奇妙的用法么?
看代码:
String.format("A=%1.2f,B=%2.1f,C=%3.5f,D=%3.1f", 2222.0444f, 2.0444f, 3.1f,0.1f)
结果:
A=2222.04,B=2.0,C=3.10000,D=0.1
会发现,对于%nf,n小数点后边代表的是所保留的最大位数。如果不够最大位数,那么会自动末尾补0,那么小数点前边的整数貌似看起来没起到什么作用。其实它也是有作用的,只不过不是用于String.format中,而是用于以下场景。
我们可能会有需要将日志按照一定的格式输出到文件中,那么我们会定义一个formatter对象来格式化日志,这个时候,%nf,n的小数点前几位就有作用了。他会按照上下文打印的字符串,对应的在数据前边补齐空格。从而输出的文档中,数据是格式化好的。
如何使用:
Formatter formatter = new Formatter(fileName);
formatter.format("----XXX日志----");
formatter.format("A=%1.2f,B=%2.1f,C=%3.5f,D=%3.1f", 2222.0444f, 2.0444f, 3.1f, 0.1f);