ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Formatter(格式化)

2021-11-10 18:06:56  阅读:208  来源: 互联网

标签:conversion 格式化 抛出 width flag 给定 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有