最近看到类似这样的一些代码: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"。 |
具体的自个再看文档去吧!