1 问题描述
在一开始,本人是从C语言转为Java的学习。对于C语言习惯了使用sprintf和格式符的的输出习惯,而Java大多使用System.out.println()的方式进行输出。那Java String能不能使用格式说明符呢?
2 问题分析
在查询了java的String格式文档后,发现对于各种String格式说明符它确实包含了所有信息,但有点零散。
与C语言相比:相似的是大多数的格式控制符的意义;不同的是可一次性输出的方式,这也是初学者容易混淆的地方,Java使用的使用java.io.PrintStream的printf方法实现C风格的输出,等。
3 解决方案
对比C语言中scanf与sprintf方法直接使用格式化的方式,Java的格式化分为三种情况:格式化字符串、格式化的控制台输出、Formatter对象。
格式化字符串:常见的方法是使用String.format(String format, Object... args),用于创建格式化的字符串以及连接多个字符串对象。此种形式的format方法中:第一个参数为含有格式说明符的表达式,其实尝试也就能够发现只要格式说明符正确就能正确输出;第二…N个参数为一一对应且打算替换的内容。
此种方法的创建及输出方式由下图可见,看似简单但值得注意的有两点:①第一个参数中的百分号必须为英文状态下;②String.format返回值为String对象,因此使用常规的输出语句即可。
格式化的控制台输出:使用java.io.PrintStream的printf方法,printf 方法的第一个参数为输出的格式,第二个参数是可变长的,表示待输出的数据对象(与String.fromat相似)。
Formatter对象:创建一个Formatter 并将其链接到StringBuilder。使用format()方法格式化的输出将附加到StringBuilder。对于此种方法,还可以继续在末尾进行sbuf追加数据,结果如第二张图。个人认为不太便捷吧,但始终直用到一个对象也不是太多空间。
格式说明符
以下是对所有支持的转换说明符的快速参考
符 | 适用于 | 输出 |
%a | 浮点(BigDecimal除外 ) | 十六进制浮点数输出 |
%b | 随便哪种 | 如果非null则为“true”,如果为null则为“false” |
%c | 字符 | Unicode字符 |
%d | 整数(包括byte,short,int,long,bigint) | 十进制整数 |
%e | 浮点 | 科学记数法中的十进制数 |
%f | 浮点 | 十进制数 |
%g | 浮点 | 十进制数,可能采用科学计数法,具体取决于精度和数值。 |
%h | 随便哪种 | Hex来自hashCode()方法的值的字符串。 |
%n | 没有 | 特定于平台的行分隔符。 |
Ø% | 整数(包括byte,short,int,long,bigint) | 八进制数 |
%s | 随便哪种 | 字符串值 |
%t | 日期/时间(包括长,日历,日期和时间访问者) | %t是日期/时间转换的前缀。此后需要更多格式化标志。请参阅下面的日期/时间转换。 |
%x | 整数(包括byte,short,int,long,bigint) | 十六进制字符 |
日期和时间格式
在下表中使用带有“%T”而不是“%t”的格式字符会使输出大写。
标志 | 笔记 |
%tA | 一周中某一天的全名,例如“ Sunday”,“ Monday” |
%ta | 工作日的缩写名称,例如“ Sun”,“ Mon”等。 |
%tB | 月份的全名,例如“ January”,“ February”等。 |
%tb | 缩写的月份名称,例如“ Jan”,“ Feb”等。 |
%tC | 年份的世纪部分用两位数字格式化,例如“00”到“99”。 |
%tc | 用“ %ta %tb %td %tT %tZ %tY” 格式化的日期和时间,例如“ Fri Feb 17 07:45:42 PST 2017” |
%tD | 格式为“ %tm/%td/%ty”的日期 |
%td | 用两位数格式化的月份日期。例如“ 01”到“ 31”。 |
%te | 格式化的日期没有前导0,例如“1”到“31”。 |
%tF | ISO 8601格式化日期为“ %tY-%tm-%td”。 |
%tH | 24小时制的一天中的小时,例如“ 00”到“ 23”。 |
%th | 与%tb相同。 |
%tI | 12小时制的一天中的小时,例如“ 01” - “ 12”。 |
%tj | 一年中的某一天格式化为前导0,例如“ 001”到“ 366”。 |
%tk | 24小时制的一天中没有前导0例如“ 0”到“ 23”的小时。 |
%tl | 12小时点击的一天中没有前导0例如“ 1”到“ 12” 的小时。 |
%tM | 在一小时内分钟格式化前导0例如“ 00”到“ 59”。 |
%tm | 用前导0格式化的月份,例如“ 01”到“ 12”。 |
%tN | 纳秒格式为9位且前导0,例如“000000000”至“999999999”。 |
%tp | 区域设置特定“am”或“pm”标记。 |
%tQ | 自1970年1月1日00:00:00 UTC以来的毫秒数。 |
%tR | 时间格式为24小时,例如“ %tH:%tM”。 |
%tr | 格式化为12小时的时间,例如“ %tI:%tM:%tS %Tp”。 |
%tS | 用2位数字格式化的分钟内的秒数,例如“00”到“60”。需要“60”来支持闰秒。 |
%ts | 自1970年1月1日00:00:00 UTC以来的秒数。 |
%tT | 时间格式为24小时,例如“ %tH:%tM:%tS”。 |
%tY | 年份格式为4位,例如“ 0000”至“ 9999”。 |
%ty | 年份格式为2位数字,例如“ 00”至“ 99”。 |
%tZ | 时区缩写。例如“ UTC”,“ PST”等 |
%tz | GMT的时区抵消,例如“ -0800 ” |
论证索引
参数索引被指定为在“ $”之后以“ %” 结尾的数字,并在参数列表中选择指定的参数。
String.format("%2$s", 32, "Hello"); // prints: "Hello"
String.format("%2$s", 32, "Hello"); // prints: "Hello"
格式化整数
使用%d格式说明符,您可以使用所有整数类型的参数,包括byte,short,int,long和BigInteger
默认格式:String.format("%d", 93); // prints 93
指定长度:String.format("|%20d|", 93); // prints: | 93|
在指定宽度内左对齐:
String.format("|%-20d|", 93); // prints: |93 |
用零填充:
String.format("|%020d|", 93); // prints: |00000000000000000093|
使用“+”打印正数:(负数始终包含“-”)
String.format("|%+20d|', 93); // prints: | +93|
正数之前空格:根据正常情况,负数包括“ - ”。
String.format("|% d|", 93); // prints: | 93| String.format("|% d|", -36); // prints: |-36|
使用特定于语言环境的千位分隔符:对于美国语言环境,它是“,”:
String.format("|%,d|", 10000000); // prints: |10,000,000|
在括号内加上负数(“(()”)并跳过“ - ”:
String.format("|%(d|", -36); // prints: |(36)|
八进制输出:String.format("|%o|"), 93); // prints: 135
十六进制输出:String.format("|%x|", 93); // prints: 5d
八进制和十六进制输出的替代表示:打印带有前导“ 0”的八进制数字和带有前导“ ”的十六进制数字0x。
String.format("|%#o|", 93);
// prints: 0135
String.format("|%#x|", 93);
// prints: 0x5d
String.format("|%#X|", 93);
// prints: 0X5D
字符串和字符转换
打印整个字符串:
String.format("|%s|", "Hello World"); // prints: "Hello World"
指定字段长度:
String.format("|%30s|", "Hello World"); // prints: | Hello World|
左对齐文本:
String.format("|%-30s|", "Hello World"); // prints: |Hello World |
指定最大字符数:
String.format("|%.5s|", "Hello World"); // prints: |Hello|
字段宽度和最大字符数:
String.format("|%30.5s|", "Hello World"); | Hello|
4 总结
本文简要介绍了利用Java进行字符串格式化的三种方法:格式化字符串、格式化的控制台输出、Formatter对象。也将Java所有支持的转换说明符进行列举。
如本文有所不足欢迎提出,共同学习,共同进步。
翻译文献
Jay Srihar——《Java String Format Examples》——DZone