JAVA字符串格式化

1 问题描述

在一开始,本人是从C语言转为Java的学习。对于C语言习惯了使用sprintf和格式符的的输出习惯,而Java大多使用System.out.println()的方式进行输出。那Java String能不能使用格式说明符呢?

2 问题分析

在查询了javaString格式文档后,发现对于各种String格式说明符它确实包含了所有信息,但有点零散。

C语言相比:相似的是大多数的格式控制符的意义;不同的是可一次性输出的方式,这也是初学者容易混淆的地方,Java使用的使用java.io.PrintStreamprintf方法实现C风格的输出,等。

3 解决方案

对比C语言中scanfsprintf方法直接使用格式化的方式,Java的格式化分为三种情况:格式化字符串、格式化的控制台输出、Formatter对象。

格式化字符串:常见的方法是使用String.format(String format, Object... args),用于创建格式化的字符串以及连接多个字符串对象。此种形式的format方法中:第一个参数为含有格式说明符的表达式,其实尝试也就能够发现只要格式说明符正确就能正确输出;第二…N个参数为一一对应且打算替换的内容。

此种方法的创建及输出方式由下图可见,看似简单但值得注意的有两点:第一个参数中的百分号必须为英文状态下;String.format返回值为String对象,因此使用常规的输出语句即可。

格式化的控制台输出:使用java.io.PrintStreamprintf方法,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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值