本文转载于 String.format()方法使用说明 http://blog.csdn.net/thc1987/article/details/17528093
和JAVA字符串格式化-String.format()的使用 http://blog.csdn.net/lonely_fireworks/article/details/7962171
Android中经常会碰到字符串格式化的问题,经常记不住格式,所以在网上看到一位大神的blog写的不错,就转载记录下来,方便以后的查阅。
JDK1.5开始String类中提供了一个非常有用的方法String.format(String format, Object ... args)
查看源码得知其实是调用了Java.util.Formatter.format(String, Object...)方法
String.format(String format, Object ... args) 这个方法最重要的的地方就是它的第一个参数String format,我们只要掌握了这个参数的用法也就掌握了String.format的用法
首先来看一个列子
这里会打印出什么内容?
先不急着去运行它,相信阅读到后面不用运行,你也会知道的.
查看JDK文档得知,String.format方法的第一个参数是有个公式可以套的
%[argument_index$][flags][width][.precision]conversion
这里我们只要牢记这个公式就可以,下面说下每个颜色所代表的含义
argument_index: 可选,是一个十进制整数,用于表明参数在参数列表中的位置。第一个参数由 "1$" 引用,第二个参数由 "2$" 引用,依此类推。
flags: 可选,用来控制输出格式
width: 可选,是一个正整数,表示输出的最小长度
precision:可选,用来限定输出字符数
conversion:必须,用来表示如何格式化参数的字符
先看一个简单的列子:
这里我们只用了%s这个简单的表达式,对比上面的公式,我们发现[argument_index$][flags][width][.precision]这些部分全部都省略掉了
只留下一个必须的conversion,在这里conversion就是"s",百分号%是固定不变的
[argument_index$]省略之后它会自动把"小明"这个值填入到%s中去
我再稍微改下列子:
这里会按顺序分别把小明,小方填入到对应的%s中. 如果我们要把小方填在前面,小明填在后面,那该怎么做呢,[argument_index$]就派上用场了
依然是百分号%开头,中间多了个2$,1$
conversion可以填s,那还有什么其它字母可以填呢,当然有的比如
o:结果被格式化为八进制整数
x:结果被格式化为十六进制
d:结果被格式化为十进制整数
更多的conversion类别可以参考JDK文档java.util.Formatter类
至此,我们已经了解了argument_index$和conversion的用处,接下来我们了解flag和width的用法
flag是用来控制输出格式的,比如左对齐,金额用逗号隔开等
width:表示最小宽度
先看个列子:
这里多出一个逗号",",它就是flag,用于金额千分位隔开,当然写成"%,d"也是可以的
再一个列子:
这里0就是flag,表示结果将用零来填充,8就是width,表示最少要8位,d是conversion
至于其它的flag可以查阅JDK文档
接下来说下[.precision]
这个单词翻译下是精度的意思,我们发现了前面有个小数点".",因此不难联想到这个是关于浮点数类型的
只有当传入的数据是浮点数时这个才有用,整数或者日期类型的数据都不能用
比如我想要四舍五入保留两位小数,那么我可以这么写:
这里f表示传入的数字是浮点型,如果传入的是整数,或者把f改成d都会抛出异常,JDK文档中有明确说明
对于浮点转换 'e'、'E' 和 'f',精度是小数点分隔符后的位数。如果转换是 'g' 或 'G',那么精度是舍入计算后所得数值的所有位数。如果转换是 'a' 或 'A',则不必指定精度。
对于字符、整数和日期/时间参数类型转换,以及百分比和行分隔符转换,精度是不适用的;如果提供精度,则会抛出异常。
到现在为止这套表达式公式已经基本讲完了,这套公式是针对于基本数据类型,和字符串的,如果是正对于时间类型的数据该怎么做呢,比如格式化日期
其实文档中已经给出说明了:
- 用来表示日期和时间类型的格式说明符的语法如下:
%[argument_index$][flags][width]conversion
可选的 argument_index、flags 和 width 的定义同上。
所需的 conversion 是一个由两字符组成的序列。第一个字符是 't' 或 'T'。第二个字符表明所使用的格式。这些字符类似于但不完全等同于那些由 GNU date 和 POSIX strftime(3c) 定义的字符。
需要注意的是conversion 是一个由两字符组成的序列。第一个字符是 't' 或 'T'。
也就是说用conversion的时候首先必要写一个"t",然后在写其它conversion
时间类型有它自己的一套conversion,我们简单的选择几个来说:
'Y' 年份,被格式化为必要时带前导零的四位数(至少),例如,0092 等于格里高利历的 92 CE。 'm' 月份,被格式化为必要时带前导零的两位数,即 01 - 13。 'd' 一个月中的天数,被格式化为必要时带前导零两位数,即 01 - 31 上面三个分别表示年月日
如果我要显示年份,我就可以"%tY",显示月份我就可以写"%tm",记得一定要带上"t"
那么本篇一开始提到的那串复杂的表达式现在看来是不是很简单呢:
String.format()方法差不多讲完了,仔细看JDK文档也会慢慢了解的
需要批量进行格式化时,考虑下DateFormat, MessageFormat, NumberFormat 把他们封装成一个静态工具类或许更好
毕竟调用String.format()方法是会new一个Formatter对象,虽然有GC帮忙,但是平时编程的时候还是要考虑这些因素的
尽量少的创建对象,节省资源。
-
示例
-
常规类型的格式化
String类的format()方法用于创建格式化的字符串以及连接多个字符串对象。熟悉C语言的同学应该记得C语言的sprintf()方法,两者有类似之处。format()方法有两种重载形式。
format(String format, Object... args) 新字符串使用本地语言环境,制定字符串格式和参数生成格式化的新字符串。
format(Locale locale, String format, Object... args) 使用指定的语言环境,制定字符串格式和参数生成格式化的字符串。
显示不同转换符实现不同数据类型到字符串的转换,如图所示。
测试用例转 换 符
说 明
示 例
%s
字符串类型
"mingrisoft"
%c
字符类型
'm'
%b
布尔类型
true
%d
整数类型(十进制)
99
%x
整数类型(十六进制)
FF
%o
整数类型(八进制)
77
%f
浮点类型
99.99
%a
十六进制浮点类型
FF.35AE
%e
指数类型
9.38e+5
%g
通用浮点类型(f和e类型中较短的)
%h
散列码
%%
百分比类型
%
%n
换行符
%tx
日期与时间类型(x代表不同的日期与时间转换符
输出结果
搭配转换符的标志,如图所示。
测试用例标 志
说 明
示 例
结 果
+
为正数或者负数添加符号
("%+d",15)
+15
−
左对齐
("%-5d",15)
|15 |
0
数字前面补0
("%04d", 99)
0099
空格
在整数之前添加指定数量的空格
("% 4d", 99)
| 99|
,
以“,”对数字分组
("%,f", 9999.99)
9,999.990000
(
使用括号包含负数
("%(f", -99.99)
(99.990000)
#
如果是浮点数则包含小数点,如果是16进制或8进制则添加0x或0
("%#x", 99)
("%#o", 99)
0x63
0143
<
格式化前一个转换符所描述的参数
("%f和%<3.2f", 99.45)
99.450000和99.45
$
被格式化的参数索引
("%1$d,%2$s", 99,"abc")
99,abc
输出结果
日期和事件字符串格式化在程序界面中经常需要显示时间和日期,但是其显示的 格式经常不尽人意,需要编写大量的代码经过各种算法才得到理想的日期与时间格式。字符串格式中还有%tx转换符没有详细介绍,它是专门用来格式化日期和时 间的。%tx转换符中的x代表另外的处理日期和时间格式的转换符,它们的组合能够将日期和时间格式化成多种格式。
常见日期和时间组合的格式,如图所示。
测试用例转 换 符
说 明
示 例
c
包括全部日期和时间信息
星期六 十月 27 14:21:20 CST 2007
F
“年-月-日”格式
2007-10-27
D
“月/日/年”格式
10/27/07
r
“HH:MM:SS PM”格式(12时制)
02:25:51 下午
T
“HH:MM:SS”格式(24时制)
14:28:16
R
“HH:MM”格式(24时制)
14:28
输出结果定义日期格式的转换符可以使日期通过指定的转换符生成新字符串。这些日期转换符如图所示。
输出结果和日期格式转换符相比,时间格式的转换符要更多、更精确。它可以将时间格式化成时、分、秒甚至时毫秒等单位。格式化时间字符串的转换符如图所示。
转 换 符
说 明
示 例
H
2位数字24时制的小时(不足2位前面补0)
15
I
2位数字12时制的小时(不足2位前面补0)
03
k
2位数字24时制的小时(前面不补0)
15
l
2位数字12时制的小时(前面不补0)
3
M
2位数字的分钟(不足2位前面补0)
03
S
2位数字的秒(不足2位前面补0)
09
L
3位数字的毫秒(不足3位前面补0)
015
N
9位数字的毫秒数(不足9位前面补0)
562000000
p
小写字母的上午或下午标记
中:下午
英:pm
z
相对于GMT的RFC822时区的偏移量
+0800
Z
时区缩写字符串
CST
s
1970-1-1 00:00:00 到现在所经过的秒数
1193468128
Q
1970-1-1 00:00:00 到现在所经过的毫秒数
1193468128984
测试代码
输出结果