对于一般字符、数字的格式修饰的格式:%[argument_index$][flags][width][.precision]conversion
argument_index$:指定参数在参数列表中的位置
flags:修改输出的字符集,其值取决于conversion
width:指定输出字符的宽度
precision:指定字符的长度,具体取决于conversion
conversion:指定格式怎么样转换的指示字符
conversion的选择(小写时结果是小写,大写时是大写)
'b','B' | 参数是null或false时,结果为false,其余为true |
'h','H' | 参数为null结果为null,否则结果为Integer.toHexString(arg.hashCode()) |
's','S' | 参数为null结果为null,若参数实现了Formattable,会调用arg.formatTo,否则结果为arg.toString() |
'c','C' | 结果格式化为字符 |
'd' | 结果格式化为十进制整数 |
'o' | 结果格式化为八进制整数 |
'x','X' | 结果格式化为十六进制整数 |
'e','E' | 结果格式化为用计算机科学计数表示法的十进制数 |
'f' | 结果格式化为十进制浮点数,参数必须是浮点数 |
'g','G' | 根据具体情况,自动选择计算机科学计数表示法还是十进制数 |
'a','A' | 结果被格式化为带有效位数和指数的十六进制浮点数 |
't','T' | 日期和时间的前缀 |
'%' | 结果是% |
'n' | 换行 |
对于日期时间的格式修饰的格式:%[argument_index$][flags][width]conversion
参数说明如上
conversion的选择(time)
'H' | 24小时制,00-23 |
'I' | 12小时制,01-12 |
'k' | 24小时制,0-23 |
'l'(L的小写) | 12小时制,1-12 |
'M' | 分钟,00-59 |
'S' | 秒,00-60 |
'L' | 毫秒,000-999 |
'N' | 纳秒,000000000-999999999 |
'p' | 特定于区域的前缀,am和pm |
'z' | 相对于 GMT 的 RFC 822 格式的数字时区偏移量,例如 -0800 |
'Z' | 表示时区缩写形式的字符串。Formatter 的语言环境将取代参数的语言环境(如果有) |
's' | 从1970年1月1日00:00:00到现在的秒数 |
'Q' | 从1970年1月1日00:00:00到现在的纳秒数 |
conversion的选择(date)
'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' | 一年的某一天,000-366 |
'm' | 月份,01-13 |
'd' | 一月的某天,01-31 |
'e' | 一月的某天,1-31 |
conversion的选择(date/time)
'R' | 时间格式化为24小时制:%tH:%tM |
'T' | 时间格式化为24小时制:%tH:%tM:%tS |
'r' | 时间格式化为12小时制:%tI:%tM:%S:%Tp |
'D' | 格式化为:%tm/%td/%ty |
'F' | 格式化为:%tY-%tm-%td |
'c' | 格式化为:%ta %tb %td %tT %tZ %tY,如:Sun Jul 20 16:17:00 EDT 1969 |
Flag(可以有多个)
'-' | 在最小宽度内左对齐,不可以与“用0填充”同时使用 |
'#' | 只适用于8进制和16进制,8进制时在结果前面增加一个0,16进制时在结果前面增加0x |
'+' | 结果有符号 |
' ' | 正值前加空格,负值前加负号(一般情况下只适用于10进制,若对象为BigInteger才可以用于8进制和16进制) |
'0' | 结果用0填充 |
',' | 只适用于10进制,每3位数字之间用“,”分隔 |
'(' | 若参数是负数,则结果中不添加负号而是用圆括号把数字括起来(同‘+’具有同样的限制) |
详述:
(格式化的详述)
异常:
所有字符没有conversion、date/time conversion前缀或flag被忽略了并被保留以后的扩展,会引起UnknownFormatConversionException
或UnknownFormatFlagsException
异常
如果width或precision没有合法的参数,会抛出IllegalFormatWidthException
或IllegalFormatPrecisionException
如果conversion的参数不合法,胡抛出IllegalFormatConversionException
通用conversion
'b' | 返回Boolean.toString(boolean)。若参数为null或false,结果为false,其余为true。若给定了'#'flag,会抛出FormatFlagsConversionMismatchException
|
'B' | 'b'的大写 |
'h' | 返回对象的哈希码。若参数为null,结果为null。否则结果为Integer.toHexString(arg.hashCode()) |
'H' | 'h'的大写 |
's' | 参数为null结果为null,若参数实现了Formattable,会调用arg.formatTo,否则结果为arg.toString()。若给定了'#'flag但是arg不是一个Formattable,会抛出FormatFlagsConversionMismatchException
|
'S' | 's'的大写 |
可以应用给通用conversion的flag
'-' | 左对齐,若没有width,会抛出MissingFormatWidthException
|
'#' | 一个交换形式的输出, 形式的指定通过conversion指定. |
width指定转换的字符床的最小字符输出长度,若小于width,小于width的部分会被' '(空格)替代,直到长度为width。默认填充在左边,若给定了'-'flag,则填充在右边。若没有指定width,字符串的长度就没有最小值。
precision指定了输出的最大的字符数。precision优先于width。
Character
应用于char和Character,当Character.isValidCodePoint(int)返回true,也可以应用于byte、Byte、short、Short、int、Integer,当Character.isValidCodePoint(int)返回false,会抛出IllegalFormatCodePointException
'c' | 格式化参数为Unicode码,若给定了'#'flag,会抛出FormatFlagsConversionMismatchException
|
'C' | 'c'的大写形式 |
此时的'-'同通用conversion时的flag,若给定了'#',会抛出FormatFlagsConversionMismatchException。
此时的width同通用conversion时的flag,而precision不可用,否则抛出IllegalFormatPrecisionException
Numeric
Numeric的conversion有四种分类
1、Byte、Short、Integer、Long
2、BigInteger
3、Float、Double
4、BigDecimal
数字的本地化算法
数字有整数部分、小数部分和指数部分,此时可以应用下面的转换:
1、字符串中的数字字符会被计算好的相对于当前本地的零数字(zero digit)替换
2、若十进制分隔符是%,就会替换一个特定于本地的十进制分隔符
3、若给定了','flag,就会在数字当中按照组大小(group size)插入','
4、若给定了'0'flag,就会插入到数字的最后或数字的开头,直到长度等于width
5、如果是负数并且给定了'('flag,那么会在数字开头加'(',数字结尾加')'
6、如果是负数(或-0.0)但是没有给定'('flag,那么会在数字结果开头加'-'
7、若给定了'+'并且是整数或0(或0.0),那么会在结果前加'+'
如果给定的值是NaN或是正无穷大值,相应的会返回 "NaN“ 或 "Infinity“。如果是负无穷大且给定了'('flag,则返回 "(Infinity)",否则输出 "-Infinity"。
Byte、Short、Integer and Long
conversion(byte,Byte,short,Short,int,Integer,long,Long)
'd' | 格式化为十进制,可以应用本地算法,若给定了'0'flag,且为负值,'0'会填充在负号与值之间,若又给定了'#',会抛出FormatFlagsConversionMismatchException
|
'o' | 格式化为八进制,不能应用本地算法,若给定了'#'flag,输出会有'0',若给定了'0'flag,输出就会在指示符'0'与值之间填充零,若给定了'('、'+'或',',会抛出FormatFlagsConversionMismatchException
|
'x' | 格式化为十六进制,不能应用本地算法,若给定了'#'flag,输出会有'0',若给定了'0'flag,输出就会在指示符'0'与值之间填充零,若给定了'('、'+'或',',会抛出FormatFlagsConversionMismatchException
|
'X' | 'x‘的大写 |
如果conversion是'o','x'或'X'并且同时给出了'#'flag和'0'flag,结果将会包含基数指示符(八进制是'0',十六进制是'0x')、一些零和数值。
若没有给定'-'flag,会在符号前填充空格。
flag(应用在数值积分conversion上)
'+' | 结果有符号,如果还给定了' 'flag,会抛出IllegalFormatFlagsException
|
' ' | 正数前有一个空格,负数前有负号,若还给定了'+'flag,会抛出IllegalFormatFlagsException
|
'0' | 当不是NaN和inifinity时,输出时在符号或基数后面填充零,若未给定width,会抛出MissingFormatWidthException,若还给定了'-'flag,会抛出IllegalFormatFlagsException |
',' | 每组数之间用','分隔 |
'(' | 若值是负数,该值放在()内 |
若未给定flag,默认的flag如下:
在width内右对齐
负数前有负号
正数和零前不包含任何符号和空格
没有组分隔符
width的长度包含了符号、数字、基数符号、组分隔符和'('
precision不可用,否则抛出IllegalFormatPrecisionException
BigInteger
conversion
'd' | 格式化为十进制,可以应用本地算法,若又给定了'#',会抛出FormatFlagsConversionMismatchException
|
'o' | 格式化为八进制,不能应用本地算法,若值大于等于零,结果会有正号,若给定了'#'flag,输出会有基数指示符'0',若给定了'0'flag,输出就会在指示符'0'与值之间填充零,若给定',',会抛出FormatFlagsConversionMismatchException
|
'x' | 格式化为十六进制,不能应用本地算法,若值大于等于零,结果会有正号,若给定了'#'flag,输出会有'0',若给定了'0'flag,输出就会在指示符'0'与值之间填充零,若给定了',',会抛出FormatFlagsConversionMismatchException
|
'X' | 'x‘的大写 |
如果conversion是'o','x'或'X'并且同时给出了'#'flag和'0'flag,结果将会包含基数指示符(八进制是'0',十六进制是'0x')、一些零和数值。
如果值是负数且有'0'flag,'0'会填充在符号与数值之间。
width的长度包含了符号、数字、基数符号、组分隔符和'('
precision不可用,否则抛出IllegalFormatPrecisionException
Float和Double
conversion
'e' | 结果为计算机科学计数表示法,本地算法有效,若值为NaN或infinity,结果是'NaN'或'Infinity',若值为+0或-0,指数就是+00, |
'E' | 'e'的大写形式 |
'g' | 根据具体情况,自动选择计算机科学计数表示法还是十进制数 |
'G' | 'g'的大写形式 |
'f' | 结果格式化为十进制浮点数 |
'a' | 结果被格式化为带有效位数和指数的十六进制浮点数 |
'A' | 'a'的大写形式 |