其他分享
首页 > 其他分享> > Formatter(格式化)

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'的大写形式

标签:conversion,格式化,抛出,width,flag,给定,Formatter
来源: https://blog.csdn.net/wy820421/article/details/121253475