最近看到类似这样的一些代码:String.format("参数%s不能为空", "birthday"); 以前还没用过这功能不知咐意思,后研究了一下,详细讲解如下。
public static String format(String format, Object... args)的功能非常强大,用法非常灵活。主要的意思是返回指定的格式化的字符串。Format参数为格式字符串语法如下:
%[argument_index$][flags][width][.precision]conversion
“[]”里的参数表示可选。
可选的 argument_index :下标是一个十进制整数,用于表明参数在参数列表中的位置。
可选的 flags 标志是修改输出格式的字符集。有效标志的集合取决于转换类型。
可选 width 最小宽度是一个非负十进制整数,表明要向输出中写入的最少字符数。
可选 precision 是一个非负十进制整数,通常用来限制字符数。特定行为取决于转换类型。
所需的 conversion转换方式是一个表明应该如何格式化参数的字符。给定参数的有效转换集合取决于参数的数据类型。
上面解释比较枯燥,代码举例如下;
Eg1:说明argument_index和width
System.out.println(msg);
String s = String.format("this is a %2$s %1$s %s %s test", "java", "C++");
this is a C++ java java C++ test
Eg2.说明 flags
System.out.println(String.format("%1$,09d", -3872));
System.out.println(String.format("%1$,010d", -3872));
System.out.println(String.format("%1$,09d", 3872));
System.out.println(String.format("%1$9d", -14));
System.out.println(String.format("%1$-9d", -14));
System.out.println(String.format("%1$(9d", -14));
System.out.println(String.format("%1$#9x", 31));
结果:
-0003,872
-00003,872
00003,872
-14
-14
(14)
0x1f
下表总结了受支持的标志。y 表示该标志受指示参数类型支持。
标志 |
常规 |
字符 |
整数 |
浮点 |
日期/时间 |
说明 |
'-' |
y |
y |
y |
y |
y |
结果将是左对齐的。 |
'#' |
y1 |
- |
y3 |
y |
- |
结果应该使用依赖于转换类型的替换形式 |
'+' |
- |
- |
y4 |
y |
- |
结果总是包括一个符号 |
' ' |
- |
- |
y4 |
y |
- |
对于正值,结果中将包括一个前导空格 |
'0' |
- |
- |
y |
y |
- |
结果将用零来填充 |
',' |
- |
- |
y2 |
y5 |
- |
结果将包括特定于语言环境的组分隔符 |
'(' |
- |
- |
y4 |
y5 |
- |
结果将是用圆括号括起来的负数 |
Eg3:说明conversion
System.out.println(String.format("this is:%s %s", "string", "format"));
System.out.println(String.format("%b, %b, %b, %b, %b, %b", "true",true, false, null, 0>1, 1, ""));
System.out.println(String.format("%o", 31));
System.out.println(String.format("%x", 31));
System.out.println(String.format("%e", 12345.6987));
System.out.println(String.format("%a", 12345.6987));
System.out.println(String.format("%c, %c, %c, %c", 'a', 'b', 48, 98));
结果:
this is:string format
true, true, false, false, false, true
37
1f
1.234570e+04
0x1.81cd96f0068dcp13
a, b, 0, b
标志的说明:
转换 |
参数类别 |
说明 |
'b', 'B' |
常规 |
如果参数 arg 为 null,则结果为 "false"。如果 arg 是一个 boolean 值或 Boolean,则结果为 String.valueOf() 返回的字符串。否则结果为 "true"。 |
'h', 'H' |
常规 |
如果参数 arg 为 null,则结果为 "null"。否则,结果为调用 Integer.toHexString(arg.hashCode()) 得到的结果。 |
's', 'S' |
常规 |
如果参数 arg 为 null,则结果为 "null"。如果 arg 实现 Formattable,则调用 arg.formatTo。否则,结果为调用 arg.toString() 得到的结果。 |
'c', 'C' |
字符 |
结果是一个 Unicode 字符 |
'd' |
整数 |
结果被格式化为十进制整数 |
'o' |
整数 |
结果被格式化为八进制整数 |
'x', 'X' |
整数 |
结果被格式化为十六进制整数 |
'e', 'E' |
浮点 |
结果被格式化为用计算机科学记数法表示的十进制数 |
'f' |
浮点 |
结果被格式化为十进制数 |
'g', 'G' |
浮点 |
根据精度和舍入运算后的值,使用计算机科学记数形式或十进制格式对结果进行格式化。 |
'a', 'A' |
浮点 |
结果被格式化为带有效位数和指数的十六进制浮点数 |
't', 'T' |
日期/时间 |
日期和时间转换字符的前缀。请参阅日期/时间转换。 |
'%' |
百分比 |
结果为字面值 '%' ('u0025') |
'n' |
行分隔符 |
结果为特定于平台的行分隔符 |
String msg = String.format("参数%s不能为空", "birthday");
System.out.println(msg);
Eg4:格式化日期
Calendar c = Calendar.getInstance();
String data_str = String.format("today is: %1$tY/%1$tm/%1$te, now time is %1$tH:%1$tM:%1$tS", c);
结果:
today is: 2013/10/31, now time is 17:36:49
日期类标志的说明:
以下日期和时间转换字符后缀是为 't' 和 'T' 转换定义的。这些类型类似于但不完全等同于 GNU date 和 POSIX strftime(3c) 定义的那些类型。提供其他转换类型是为了访问特定于Java 的功能(例如,'L' 用于秒中的毫秒)。
以下转换字符用来格式化时间:
'H' |
'u0048' |
24 小时制的小时,被格式化为必要时带前导零的两位数,即 00 - 23。00 对应午夜。 |
'I' |
'u0049' |
12 小时制的小时,被格式化为必要时带前导零的两位数,即 01 - 12。01 对应于 1 点钟(上午或下午)。 |
'k' |
'u006b' |
24 小时制的小时,即 0 - 23。0 对应于午夜。 |
'l' |
'u006c' |
12 小时制的小时,即 1 - 12。1 对应于上午或下午的一点钟。 |
'M' |
'u004d' |
小时中的分钟,被格式化为必要时带前导零的两位数,即 00 - 59。 |
'S' |
'u0053' |
分钟中的秒,被格式化为必要时带前导零的两位数,即 00 - 60("60" 是支持闰秒所需的一个特殊值)。 |
'L' |
'u004c' |
秒中的毫秒,被格式化为必要时带前导零的三位数,即 000 - 999。 |
'N' |
'u004e' |
秒中的毫微秒,被格式化为必要时带前导零的九位数,即 000000000 - 999999999。此值的精度受基础操作系统或硬件分析的限制。 |
'p' |
'u0070' |
特定于语言环境的上午或下午标记以小写形式表示,例如 "am" 或 "pm"。使用转换前缀 'T' 可以强行将此输出转换为大写形式。(注意,'p' 产生的输出是小写的。而GNU date 和 POSIX strftime(3c) 产生的输出是大写的。) |
'z' |
'u007a' |
相对于 GMT 的 RFC 822 格式的数字时区偏移量,例如 -0800。 |
'Z' |
'u005a' |
表示时区的缩写形式的字符串。 |
's' |
'u0073' |
自协调世界时 (UTC) 1970 年 1 月 1 日 00:00:00 至现在所经过的秒数,也就是 Long.MIN_VALUE/1000 与 Long.MAX_VALUE/1000 之间的差值。 |
'Q' |
'u004f' |
自协调世界时 (UTC) 1970 年 1 月 1 日 00:00:00 至现在所经过的毫秒数,即 Long.MIN_VALUE 与 Long.MAX_VALUE 之间的差值。此值的精度受基础操作系统或硬件分析的限制。 |
以下转换字符用来格式化日期:
'B' |
'u0042' |
特定于语言环境的完整月份名称,例如 "January" 和 "February"。 |
'b' |
'u0062' |
特定于语言环境的月份简称,例如 "Jan" 和 "Feb"。 |
'h' |
'u0068' |
与 'b' 相同。 |
'A' |
'u0041' |
特定于语言环境的星期几的全称,例如 "Sunday" 和 "Monday" |
'a' |
'u0061' |
特定于语言环境的星期几的简称,例如 "Sun" 和 "Mon" |
'C' |
'u0043' |
除以 100 的四位数表示的年份,被格式化为必要时带前导零的两位数,即 00 - 99 |
'Y' |
'u0059' |
年份,被格式化为必要时带前导零的四位数(至少),例如 0092 等于格里高利历的 92 CE。 |
'y' |
'u0079' |
年份的最后两位数,被格式化为必要时带前导零的两位数,即 00 - 99。 |
'j' |
'u006a' |
一年中的天数,被格式化为必要时带前导零的三位数,例如,对于格里高利历是 001 - 366。001 对应于一年中的第一天。 |
'm' |
'u006d' |
月份,被格式化为必要时带前导零的两位数,即 01 - 13,其中 "01" 是一年的第一个月,("13" 是支持阴历所需的一个特殊值)。 |
'd' |
'u0064' |
一个月中的天数,被格式化为必要时带前导零的两位数,即 01 - 31,其中 "01" 是一个月的第一天。 |
'e' |
'u0065' |
一个月中的天数,被格式化为两位数,即 1 - 31,其中 "1" 是一个月中的第一天。 |
以下转换字符用于格式化常见的日期/时间组合。
'R' |
'u0052' |
24 小时制的时间,被格式化为 "%tH:%tM" |
'T' |
'u0054' |
24 小时制的时间,被格式化为 "%tH:%tM:%tS"。 |
'r' |
'u0072' |
12 小时制的时间,被格式化为 "%tI:%tM:%tS %Tp"。上午或下午标记 ('%Tp') 的位置可能与地区有关。 |
'D' |
'u0044' |
日期,被格式化为 "%tm/%td/%ty"。 |
'F' |
'u0046' |
ISO 8601 格式的完整日期,被格式化为 "%tY-%tm-%td"。 |
'c' |
'u0063' |
日期和时间,被格式化为 "%ta %tb %td %tT %tZ %tY",例如 "Sun Jul 20 16:17:00 EDT 1969"。 |
具体的自个再看文档去吧!