该类提供了对布局调整和对齐的支持,对数字、字符串和日期/时间数据的常用格式,以及本地特定的输出。支持常见的Java类型,如byte、BigDecimal和Calendar。通过Formattable接口为任意的用户类型提供有限的格式化定制。
格式化器对于多线程访问不一定安全。线程安全是可选的。
举例说明:
StringBuilder sb = new StringBuilder(); // Send all output to the Appendable object sb Formatter formatter = new Formatter(sb, Locale.US); // 显示参数索引可用于重新排序输出。 formatter.format("%4$2s %3$2s %2$2s %1$2s", "a", "b", "c", "d") // -> " d c b a" // 可选作为第一个参数的语言环境可用于获取特定于语言环境的数字格式。可以给出精度和宽度,以便对数值进行舍入与对齐。 formatter.format(Locale.FRANCE, "e = %+10.4f", Math.E); // -> "e = +2,7183" // '(' 数字标志可用于用小括号而不是减号来格式化负数。 组别分隔符会自动插入。 formatter.format("Amount gained or lost since last statement: $ %(,.2f", balanceDelta); // -> "Amount gained or lost since last statement: $ (6,217.58)"
如以下调用所示,存在用于常见格式化请求的便捷方法:
// 写一个格式化的字符串到 System.out. System.out.format("Local time: %tT", Calendar.getInstance()); // -> "Local time: 13:34:18" // 将格式化的输出写到 System.err. System.err.printf("Unable to open file '%1$s': %2$s", fileName, exception.getMessage()); // -> "Unable to open file 'food': No such file or directory"
像 C语言的sprintf(3)
,字符串可以使用静态方法格式化String.format
:
// 格式化一个包含日期的字符串 import java.util.Calendar; import java.util.GregorianCalendar; import static java.util.Calendar.*; Calendar c = new GregorianCalendar(1995, MAY, 23); String s = String.format("Duke's Birthday: %1$tb %1$te, %1$tY", c); // -> s == "Duke's Birthday: May 23, 1995"
* 每个产生格式化输出的方法都需要一个格式字符串和一个参数列表。
格式字符串是一个String
可能包含固定文本和一个或多个嵌入格式说明符的字符串。
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Formatter.html#syntax
Calendar c = ...; String s = String.format("Duke's Birthday: %1$tm %1$te,%1$tY", c);
此格式字符串是该format
方法的第一个参数。它包含三个格式说明符“ %1$tm
”、“ %1$te
”和“ %1$tY
”,它们指示应如何处理参数以及应在文本中插入的位置。格式字符串的其余部分是固定文本"Dukes Birthday: "
,包括任何其他空格或标点符号。参数列表包含在格式字符串之后传递给方法的所有参数。
%[argument_index$][flags][width][.precision]conversion
可选的argument_index是一个十进制的整数,表示参数在参数列表中的位置。第一个参数用 "1$"引用,第二个用 "2$"引用,等等。
可选的flags是一组用于修改输出格式的字符。有效标志的集合取决于转换的情况。
可选的width是一个正的十进制整数,表示要写入输出的最小字符数。
可选的precision是一个非负的十进制整数,通常用于限制字符的数量。具体行为取决于转换的情况。
所需的conversion是一个字符,表示参数应该如何被格式化。一个给定参数的有效转换集取决于该参数的数据类型。
%[argument_index$][flags][width]conversion
可选的argument_index、flags和width定义如上。
所需的conversion是两个字符序列。第一个字符是't'
或'T'
。第二个字符表示要使用的格式。这些字符与 GNU
date
和 POSIX strftime(3c)
定义的字符相似但不完全相同。
%[flags][width]conversion
可选flags和width定义如上。
所需的conversion是指示要在输出中插入的内容的字符。
conversion
conversion分为以下几类:
char
、Character
、byte
、Byte
、short
和Short
. 这种转换也可以应用于类型int
和Integer当Character.isValidCodePoint(int)
返回true时
byte
, Byte
, short
, Short
, int
and Integer
, long
, Long
, and BigInteger
(但不是char或者
Character
)float
、Float
、double
、Double
和BigDecimal
long
、Long
、Calendar
和 Date
TemporalAccessor
'%'
( '\u0025'
)对于类别General、Character、Numberic、 Integral和Date/Time转换,除非另有说明,否则如果参数arg为null
,则结果为 " null
"。
conversion | 参数类别 | 描述 |
'b','B' | 一般 | 如果参数arg是null ,那么结果是 " false "。如果arg是 aboolean 或Boolean ,则结果是由 . 返回的字符串String.valueOf(arg) 。否则,结果为“真”。 |
'h','H' | 一般 | 结果是通过调用获得的 Integer.toHexString(arg.hashCode()) 。 |
's','S' | 一般 | 如果arg实现Formattable ,则 arg.formatTo 调用。否则,通过调用 获得结果arg.toString() 。 |
'c','C' | 字符 | 结果是一个 Unicode 字符 |
'd' | 整型 | 结果被格式化为十进制整数 |
'o' | 整型 | 结果被格式化为八进制整数 |
'x','X' | 整型 | 结果被格式化为十六进制整数 |
'e','E' | 浮点 | 结果被格式化为计算机科学记数法中的十进制数 |
'f' | 浮点 | 结果被格式化为十进制数 |
'g','G' | 浮点 | 结果使用计算机科学记数法或十进制格式进行格式化,具体取决于精度和舍入后的值。 |
'a','A' | 浮点 | 结果被格式化为带有有效数和指数的十六进制浮点数。尽管后者属于 浮点参数类别 ,但该类型不支持此转换。BigDecimal |
't','T' | 日期/时间 | 日期和时间转换字符的前缀。请参阅日期/时间转换。 |
'%' | 百分 | 结果是字面的'%' ( '\u0025' ) |
'n' | 行分隔符 | 结果是特定于平台的行分隔符 |
以下日期和时间转换后缀字符是定义给't','T'-这两个conversion的。
以下转换字符用于格式化时间:
'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 虚拟机实例的默认时区。格式化程序的语言环境将取代参数的语言环境(如果有)。 |
's' |
自世界标准时间 1970 年 1 月 1 日开始的纪元开始以来的秒数 00:00:00 ,即Long.MIN_VALUE/1000 到 Long.MAX_VALUE/1000 . |
'Q' |
自世界标准时间 1970 年 1 月 1 日开始的纪元开始以来的毫秒数00:00:00 ,即. 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 等于CE。92 |
'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" 。 |
任何未明确定义为日期/时间转换后缀的字符都是非法的,并为将来的扩展保留。
Flags | 一般 | 字符 | 整型 | 浮点 | 日期/时间 | 描述 |
---|---|---|---|---|---|---|
'-' | 是 | 是 | 是 | 是 | 是 | 结果将左对齐。 |
'#' | 是1 | - | 是3 | 是 | - | 结果应使用依赖于转换的替代形式 |
'+' | - | - | 是4 | 是 | - | 结果将始终包含一个标志 |
'' | - | - | 是4 | 是 | - | 结果将包括正值的前导空格 |
'0' | - | - | 是 | 是 | - | 结果将被零填充 |
',' | - | - | 是2 | 是5 | - | 结果将包括特定于语言环境的分组分隔符 |
'(' | - | - | 是4 | 是5 | - | 结果将用括号括起来负数 |
1取决于 Formattable的定义
。
2仅用于'd'
conversion。
3仅适用于'o'
、'x'
和'X'
conversion。
4对于'd'
, 'o'
, 'x'
, 和 'X'
conversions应用于BigInteger
或'd'
应用于byte
, Byte
, short
, Short
, int
和 Integer
, long
, 和Long
。
5仅适用于'e'
、'E'
、'f'
、 'g'
和'G'
conversion。
任何未明确定义为标志的字符都是非法的,并为将来的扩展保留。