Formatter(格式化)

对于一般字符、数字的格式修饰的格式:%[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'的大写形式
上一篇:java中的双冒号操作符


下一篇:MDK Keil编译程序出现..\source\main.c(118): warning: #69-D: integer conversion resulted in truncation问题