JDK1.5开始String类中提供了一个很是有用的方法String.format(String format, Object ... args)java
查看源码得知实际上是调用了java.util.Formatter.format(String, Object...)方法翻译
public static String format(String format, Object ... args) { return new Formatter().format(format, args).toString(); }
String.format(String format, Object ... args) 这个方法最重要的的地方就是它的第一个参数String format
,咱们只要掌握了这个参数的用法也就掌握了String.format的用法。首先来看一个列子code
String s2 = String.format("%1$tY-%1$tm-%1$te", new Date()); System.out.println(s2);
这里会打印出什么内容?orm
先不急着去运行它,相信阅读到后面不用运行,你也会知道的。ci
查看JDK文档得知,String.format(String format, Object ... args)方法的format
是有个公式能够套的。文档
%[argument_index$][flags][width][.precision]conversion
其中方括号中的内容能够省略,具体每一个公式的含义以下字符串
1$
引用,第二个参数由 2$
引用,依此类推。先看一个简单的列子:源码
System.out.println(String.format("个人名字叫%s", "小明")); // 打印:个人名字叫小明
这里咱们只用了%s这个简单的表达式,对比上面的公式,咱们发现[argument_index$][flags][width][.precision]这些部分所有都省略掉了io
只留下一个必须的conversion
,在这里conversion就是"s",百分号%是固定不变的。form
[argument_index$]省略以后它会自动把"小明"这个值填入到%s中去
咱们再稍微改下列子:
String.format("我叫%s,她叫%s", "小明","小方"); // 我叫小明,她叫小方
这里会按顺序分别把小明,小方填入到对应的%s中。
conversion能够填s
,那还有什么其它字母能够填呢,固然有的好比
System.out.println(String.format("%o", 8)); // 10 System.out.println(String.format("%x", 16)); // 10
更多的conversion类别能够参考JDK文档java.util.Formatter类。
接着上面的例子,若是咱们要把小方填在前面,小明填在后面,那该怎么作呢,[argument_index$]
就派上用场了
String.format("我叫%2$s,她叫%1$s", "小明","小方"); // 我叫小方,她叫小明
依然是百分号%开头,中间多了个2$
,1$
,即把“小明”这个值放到1$
所在的位置,“小方”放在2$
所在的位置。
至此,咱们已经了解了argument_index$
和conversion
的用处,接下来咱们了解flag
和width
的用法
先看个列子:
String.format("%1$,d", 12302562); // 12,302,562
这里多出一个逗号",",它就是flag
,用于金额千分位隔开,固然写成%,d
也是能够的
再一个列子:
String.format("%1$08d", 123456);// 00123456
这里0就是flag
,表示结果将用零来填充,8就是width
,表示最少要8位,d是conversion
至于其它的flag能够查阅JDK文档。
接下来讲下.precision
这个单词翻译下是精度的意思,咱们发现了前面有个小数点".",所以不难联想到这个是关于浮点数类型的
只有当传入的数据是浮点数时这个才有用,整数或者日期类型的数据都不能用
好比想要四舍五入保留两位小数,那么我能够这么写:
String.format("%1$.2f", 12.12555);// 12.13
这里f
表示传入的数字是浮点型,若是传入的是整数,或者把f
改为d
都会抛出异常,JDK文档中有明确说明。
到如今为止这套表达式公式已经基本讲完了,这套公式是针对于基本数据类型,和字符串的,若是是正对于时间类型的数据该怎么作呢,好比格式化日期。
其实文档中已经给出说明了,用来表示日期和时间类型的格式说明符的语法以下:
%[argument_index$][flags][width]conversion
可选的 argument_index
、flags
和 width
的定义同上。
所需的conversion
是一个由两字符组成的序列。第一个字符是 't' 或 'T'。第二个字符代表所使用的格式。这些字符相似于但不彻底等同于那些由 GNU date 和 POSIX strftime(3c) 定义的字符。
须要注意的是conversion
是一个由两字符组成的序列。第一个字符是 't' 或 'T'
也就是说用conversion的时候首先必要写一个t
,而后在写其它conversion
时间类型有它本身的一套conversion,咱们简单的选择几个来讲:
上面三个分别表示年月日
若是我要显示年份,我就能够%tY
,显示月份我就能够写%tm
,记得必定要带上t
那么本篇一开始提到的那串复杂的表达式如今看来是否是很简单呢:
String s2 = String.format("%1$tY-%1$tm-%1$te", new Date()); System.out.println(s2);
本篇讲解了String.format()
的用法,重点在于了解format参数表达式的做用,更多的使用方式可参阅JDK文档。