文章目录
一、语法
通用,字符和数字类型的格式说明符具有以下语法:
%[argument_index$][flags][width][.precision]conversion
argument_index
是十进制整数,表示参数列表中参数的位置。第一个参数用"1$“引用,第二个用"2$” 引用,等等。
flags
是一组修改输出格式的字符。有效标志集取决于转换。
width
是正十进制整数,表示要写入输出的字符之间的间隔。
precision
是一个非负十进制整数,通常用于限制字符数。具体行为取决于转换。
conversion
是一个字符,指示如何格式化参数。给定参数的有效转换集取决于参数的数据类型。
用于表示日期和时间的类型的格式说明符具有以下语法:
%[argument_index$][flags][width]conversion
可选的argument_index
,flags
和width
定义如上。
所需的转换是两个字符的序列。第一个字符是’t’或’T’。第二个字符表示要使用的格式。
与参数对应的格式说明符具有以下语法:
%[flags][width]conversion
flags
和width
定义如上。
+
示例
String s = String.format("%4$2s %3$2s %2$2s %1$2s", "a", "b", "c", "d");
System.out.println(s);// d c b a
Calendar c = new GregorianCalendar(1995, Calendar.MAY, 23);
String s = String.format("Duke's Birthday: %1$tb %1$te, %1$tY", c);
System.out.println(s);// Duke's Birthday: 五月 23, 1995
1.argument_index
是一个十进制整数,表示参数列表中参数的位置。第一个参数用“ 1$” 引用,第二个用“ 2$” 引用,等等。
2.flags
下表总结了支持的标志。 y表示指示的参数类型支持该标志。
Flag | 一般 | 字符 | 整数 | 浮点 | 日期/时间 | 描述 |
---|---|---|---|---|---|---|
‘-’ | y | y | y | y | y | 结果将是左对齐的 |
‘#’ | y1 | - | y3 | y | - | 结果应使用依赖于转换的替代形式 |
‘+’ | - | - | y4 | y | - | 结果将始终包含一个标志 |
’ ’ | - | - | y4 | y | - | 结果将包括正值的领先空间 |
‘0’ | - | - | y | y | - | 结果将为零填充 |
‘,’ | - | - | y2 | y5 | - | 结果将包括特定于语言环境的分组分隔符 |
‘(’ | - | - | y4 | y5 | - | 结果将括号中的负数括起来 |
注:
1取决于的定义Formattable。
2仅限’d’转换。
3 仅适用于’o’,‘x’和’X’转换。
4对于’d’,‘o’,‘x’,和 ‘X’转换应用到BigInteger 或’d’应用到byte,Byte,short,Short,int和Integer,long和Long。
5对’e’,‘E’,‘f’, ‘g’,和’G’唯一的转换。
任何未明确定义为标志的字符都是非法的,并保留用于将来的扩展。
3.width
是正十进制整数,表示要写入输出的字符之间的间隔。
4.precision
对于一般参数类型,precision是要写入输出的最大字符数。
对于浮点转换’a’,‘A’,‘e’, ‘E’,和’f’精度的小数点后的位数。如果转换为’g’或’G’,则精度是舍入后得到的幅度中的总位数。
对于字符,整数和日期/时间参数类型以及百分比和行分隔符转换,精度不适用; 如果提供精度,则抛出异常。
5.conversion
5.1分类
1.常规 - 可以应用于任何参数类型;
2.字符 -可以被应用到基本类型代表Unicode字符:char,Character,byte,Byte,short,和Short。这种转换也可以被施加到所述类型int和Integer时Character.isValidCodePoint(int)返回true;
3.数字
1).整数 -可应用于Java的整数类型:byte, Byte,short,Short,int和Integer,long,Long,和BigInteger(但不是char或Character);
2).浮点 -可用于Java的浮点类型: float,Float,double,Double,和BigDecimal。
4.日期/时间 -可以被施加到Java类型,其能够编码的日期或时间的:long,Long,Calendar, Date和TemporalAccessor;
5.百分比 - 产生文字’%’ (’\ u0025’);
6.行分隔符 - 生成特定于平台的行分隔符;
5.2conversion表格
转变 | 论证类别 | 描述 |
---|---|---|
‘b’, ‘B’ | 一般 | 如果参数arg是null,则结果为“ false”。如果arg是a boolean或者Boolean,则结果是返回的字符串String.valueOf(arg)。否则,结果为“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’ | 日期/时间 | 日期和时间转换字符的前缀。请参阅日期/时间conversion表格。 |
‘%’ | 百分 | 结果是文字’%’(’\ u0025’) |
‘n’ | 行分隔符 | 结果是特定于平台的行分隔符 |
5.3日期/时间conversion表格
为’t’和’T’转换定义了以下日期和时间转换后缀字符
以下转换字符用于格式化时间:
. | |
---|---|
‘H’ | 24小时制的一天中的小时,格式化为两位数,必要时为前导零00 - 23。 |
‘I’ | 12小时制的小时,格式化为两位数,必要时带前导零,即 01 - 12。 |
‘k’ | 24小时制的一天中的小时,即0 - 23。 |
‘l’ | 12小时制的小时,即1 - 12。 |
‘M’ | 在一小时内分钟格式化为两位数,必要时带前导零,即 00 - 59。 |
‘S’ | 分钟内的秒数,格式化为两位数,必要时带前导零,即00 - 60(“ 60”是支持闰秒所需的特殊值)。 |
‘L’ | 毫秒内的第二个格式为三位数,必要时带前导零,即000 - 999。 |
‘N’ | 在秒内的纳秒,格式化为九位数,必要时带前导零,即000000000 - 999999999。 |
‘p’ | 小写的特定区域的早晨或下午标记,例如“ am”或“ pm”。使用转换前缀会’T’强制此输出为大写。 |
‘z’ | RFC 822 样式数字时区偏离GMT,例如-0800。此值将根据夏令时的需要进行调整。对于 long,Long和Date使用的时区是此Java虚拟机实例的默认时区。 |
‘Z’ | 表示时区缩写的字符串。此值将根据夏令时的需要进行调整。对于 long,Long和Date使用的时区是此Java虚拟机实例的默认时区。Formatter的语言环境将取代参数的语言环境(如果有的话)。 |
‘s’ | 自1970年1月1日00:00:00UTC 开始以来的秒数 ,即Long.MIN_VALUE/1000到 Long.MAX_VALUE/1000。 |
‘Q’ | 从1970年1月1日00:00:00UTC 开始的时期开始的毫秒,即Long.MIN_VALUE到 Long.MAX_VALUE。 |
以下转换字符用于格式化日期:
. | |
---|---|
‘B’ | 特定于语言环境的月份全称,例如"January",“February”。 |
‘b’ | 特定于语言环境缩写月份名称,例如"Jan",“Feb”。 |
‘h’ | 与…相同’b’。 |
‘A’ | 特定于区域设置的星期几的全名,例如"Sunday",“Monday” |
‘a’ | 特定于区域设置的星期几短名称,例如"Sun",“Mon” |
‘C’ | 四位数年份除以100,格式化为两位数,必要时前导零,即00 - 99 |
‘Y’ | 年份,格式化为至少四位数,必要时带前导零,例如0092等于92公历的CE。 |
‘y’ | 年份的最后两位数字,必要时格式为前导零,即00 - 99。 |
‘j’ | 一年中的某一天,格式化为三位数,必要时带前导零,例如001 - 366格里高利历。 |
‘m’ | 月份,格式化为两位数,必要时带前导零,即01 - 13。 |
‘d’ | 每月的日期,格式化为两位数,必要时带前导零,即 01 - 31 |
‘e’ | 每月的一天,格式化为两位数,即1 - 31。 |
以下转换字符用于格式化常见日期/时间组合:
. | |
---|---|
‘R’ | 格式化为24小时制的时间为 “%tH:%tM” |
‘T’ | 格式化为24小时制的时间为"%tH:%tM:%tS"。 |
‘r’ | 格式化为12小时制的时间为"%tI:%tM:%tS %Tp"。上午或下午标记(’%Tp’)的位置可能与场所有关。 |
‘D’ | 格式为的日期"%tm/%td/%ty"。 |
‘F’ | ISO 8601 完整日期格式为"%tY-%tm-%td"。 |
‘c’ | 日期和时间格式化为"%ta %tb %td %tT %tZ %tY",例如"Sun Jul 20 16:17:00 EDT 1969"。 |
注:未明确定义为日期/时间转换后缀的任何字符都是非法的,并保留用于将来的扩展。