Java 格式化类(java.util.Formatter)基本用法
2016-10-13 19:25
274 查看
转自:http://www.blogjava.net/AS-COM/archive/2011/03/15/346321.html?opt=admin
有时会想把数字,日期,字符串按照给定规则给格式化。SUN JDK 为我们提供了这个API,它是java.util.Formatter。此类提供了对布局对齐和排列的支持,以及
对数值、字符串和日期/时间数据的常规格式和特定于语言环境的输出的支持。
如何格式化?
给定规则:
要想按照自己的想法格式化必须事先编写一个规则。那这个规则要怎么编写?
1.常规类型、字符类型和数值类型的格式说明符的语法如下:
%[argument_index$][flags][width][.precision]conversion
2.用来表示日期和时间类型的格式说明符的语法如下:
%[argument_index$][flags][width]conversion
3.与参数不对应的格式说明符的语法如下:
%[flags][width]conversion
API中有这样三种规则,很显然第一个规则的内容是最全面的。其它规则的内容和第一规则的内容有重复,那单说第一规则内容,其它规则依次类推。
注意:规则一中的precision前面要加英文句号“.”
API有以下解释:
可选的 argument_index 是一个十进制整数,用于表明参数在参数列表中的位置。第一个参数由
"1$" 引用,第二个参数由 "2$" 引用,依此类推。
可选 flags 是修改输出格式的字符集。有效标志集取决于转换类型。
可选 width 是一个非负十进制整数,表明要向输出中写入的最少字符数。
可选 precision 是一个非负十进制整数,通常用来限制字符数。特定行为取决于转换类型。
所需 conversion 是一个表明应该如何格式化参数的字符。给定参数的有效转换集取决于参数的数据类型。
argument_index很好理解,就是一参数占位符,用来表示要被格式化的参数。
flags
1 取决于 Formattable 的定义。
2 只适用于
'd' 转换。
3 只适用于
'o'、'x' 和 'X' 转换。
4 对 BigInteger 应用
'd'、'o'、'x' 和 'X' 转换时,或者对 byte 及 Byte、short 及 Short、int 及 Integer、long 及 Long 分别应用
'd' 转换时适用。
5 只适用于
'e'、'E'、'f'、'g' 和 'G' 转换。
任何未显式定义为标志的字符都是非法字符,并且都被保留,以供扩展使用。
width 就表示一最少字符数,被格式化参数用precision 截取器截取后与width 相比,被格式化参数字符数如果小于width ,则加字符则到等于width 。如果大于则width 不起作用。所以可以叫width 为少加多过器。
precision 在上面也提到了,precision 是一个截取器,用于截取被格式化参数。
conversion 转换可分为以下几类:
常规- 可应用于任何参数类型
字符- 可应用于表示 Unicode 字符的基本类型:char、Character、byte、Byte、short 和 Short。当 Character.isValidCodePoint(int) 返回
true 时,可将此转换应用于 int 和 Integer 类型
数值
1 整数- 可应用于 Java 的整数类型:byte、Byte、short、Short、int、Integer、long、Long 和 BigInteger
2 浮点- 可用于 Java 的浮点类型:float、Float、double、Double 和 BigDecimal
日期/时间- 可应用于 Java 的、能够对日期或时间进行编码的类型:long、Long、Calendar 和 Date。
百分比- 产生字面值 '%'
('\u0025')
行分隔符- 产生特定于平台的行分隔符
常出现的异常
java.util.IllegalFormatConversionException:
d != java.lang.Double : 被格式化参数类型与规则转换类型不对应。
java.util.FormatFlagsConversionMismatchException: Conversion = d, Flags = # : flag不适用于规则转换类型。
Formatter类是用正则表达式验证给定规则的
正则表达式如下:
private static final String formatSpecifier
=
"%(\\d+\\$)?([-#+0,(\\<]*)?(\\d+)?(\\.\\d+)?([tT])?([a-zA-Z%])";
总结:
最重要的是它可以格式化日期/时间,数值和字符。
可以把日期转换成年,月,日,星期等。可以为数值填充空格或0,添加分组字符,正负号,及小括号。我们可以在System.out.format
(),String.format()方法中直接应用Formatter类。
有时会想把数字,日期,字符串按照给定规则给格式化。SUN JDK 为我们提供了这个API,它是java.util.Formatter。此类提供了对布局对齐和排列的支持,以及
对数值、字符串和日期/时间数据的常规格式和特定于语言环境的输出的支持。
如何格式化?
给定规则:
要想按照自己的想法格式化必须事先编写一个规则。那这个规则要怎么编写?
1.常规类型、字符类型和数值类型的格式说明符的语法如下:
%[argument_index$][flags][width][.precision]conversion
2.用来表示日期和时间类型的格式说明符的语法如下:
%[argument_index$][flags][width]conversion
3.与参数不对应的格式说明符的语法如下:
%[flags][width]conversion
API中有这样三种规则,很显然第一个规则的内容是最全面的。其它规则的内容和第一规则的内容有重复,那单说第一规则内容,其它规则依次类推。
注意:规则一中的precision前面要加英文句号“.”
API有以下解释:
可选的 argument_index 是一个十进制整数,用于表明参数在参数列表中的位置。第一个参数由
"1$" 引用,第二个参数由 "2$" 引用,依此类推。
可选 flags 是修改输出格式的字符集。有效标志集取决于转换类型。
可选 width 是一个非负十进制整数,表明要向输出中写入的最少字符数。
可选 precision 是一个非负十进制整数,通常用来限制字符数。特定行为取决于转换类型。
所需 conversion 是一个表明应该如何格式化参数的字符。给定参数的有效转换集取决于参数的数据类型。
argument_index很好理解,就是一参数占位符,用来表示要被格式化的参数。
flags
标志 | 常规 | 字符 | 整数 | 浮点 | 日期/时间 | 说明 |
'-' | y | y | y | y | y | 结果将是左对齐的。 |
'#' | y1 | - | y3 | y | - | 结果应该使用依赖于转换类型的替换形式 |
'+' | - | - | y4 | y | - | 结果总是包括一个符号 |
' ' | - | - | y4 | y | - | 对于正值,结果中将包括一个前导空格 |
'0' | - | - | y | y | - | 结果将用零来填充 |
',' | - | - | y2 | y5 | - | 结果将包括特定于语言环境的组分隔符 |
'(' | - | - | y4 | y5 | - | 结果将是用圆括号括起来的负数 |
2 只适用于
'd' 转换。
3 只适用于
'o'、'x' 和 'X' 转换。
4 对 BigInteger 应用
'd'、'o'、'x' 和 'X' 转换时,或者对 byte 及 Byte、short 及 Short、int 及 Integer、long 及 Long 分别应用
'd' 转换时适用。
5 只适用于
'e'、'E'、'f'、'g' 和 'G' 转换。
任何未显式定义为标志的字符都是非法字符,并且都被保留,以供扩展使用。
width 就表示一最少字符数,被格式化参数用precision 截取器截取后与width 相比,被格式化参数字符数如果小于width ,则加字符则到等于width 。如果大于则width 不起作用。所以可以叫width 为少加多过器。
precision 在上面也提到了,precision 是一个截取器,用于截取被格式化参数。
conversion 转换可分为以下几类:
常规- 可应用于任何参数类型
字符- 可应用于表示 Unicode 字符的基本类型:char、Character、byte、Byte、short 和 Short。当 Character.isValidCodePoint(int) 返回
true 时,可将此转换应用于 int 和 Integer 类型
数值
1 整数- 可应用于 Java 的整数类型:byte、Byte、short、Short、int、Integer、long、Long 和 BigInteger
2 浮点- 可用于 Java 的浮点类型:float、Float、double、Double 和 BigDecimal
日期/时间- 可应用于 Java 的、能够对日期或时间进行编码的类型:long、Long、Calendar 和 Date。
百分比- 产生字面值 '%'
('\u0025')
行分隔符- 产生特定于平台的行分隔符
常规 | B b | 如果参数 arg 为 null,则结果为 "false"。如果 arg 是一个 boolean 值或Boolean,则结果为 String.valueOf() 返回的字符串。否则结果为 "true"。 |
H h | 如果参数 arg 为 null,则结果为 "null"。否则,结果为调用Integer.toHexString(arg.hashCode()) 得到的结果。 | |
S s | 如果参数 arg 为 null,则结果为 "null"。如果 arg 实现 Formattable,则调用arg.formatTo。否则,结果为调用 arg.toString() 得到的结果。 | |
字符 | C c | 结果是一个 Unicode 字符 |
整数 | d | 结果被格式化为十进制整数 |
o | 结果被格式化为八进制整数 | |
X x | 结果被格式化为十六进制整数 | |
浮点 | E e | 结果被格式化为用计算机科学记数法表示的十进制数 |
f | 结果被格式化为十进制数 | |
G g | 根据精度和舍入运算后的值,使用计算机科学记数形式或十进制格式对结果进行格式化。 | |
A a | 结果被格式化为带有效位数和指数的十六进制浮点数 | |
日期,日间 | T t | 日期和时间转换字符的前缀 |
百分比 | % | 结果为字面值 '%' |
行分隔符 | n | 结果为特定于平台的行分隔符 |
常出现的异常
java.util.IllegalFormatConversionException:
d != java.lang.Double : 被格式化参数类型与规则转换类型不对应。
java.util.FormatFlagsConversionMismatchException: Conversion = d, Flags = # : flag不适用于规则转换类型。
Formatter类是用正则表达式验证给定规则的
正则表达式如下:
private static final String formatSpecifier
=
"%(\\d+\\$)?([-#+0,(\\<]*)?(\\d+)?(\\.\\d+)?([tT])?([a-zA-Z%])";
总结:
最重要的是它可以格式化日期/时间,数值和字符。
可以把日期转换成年,月,日,星期等。可以为数值填充空格或0,添加分组字符,正负号,及小括号。我们可以在System.out.format
(),String.format()方法中直接应用Formatter类。
相关文章推荐
- 我的Java开发学习之旅------>Java 格式化类(java.util.Formatter)基本用法
- Java 格式化类(java.util.Formatter)基本用法
- java格式化----java.util.Formatter
- Java学习笔记之Formatter的用法详解(输出格式化)
- java.util.vector中的vector的详细用法
- java中String的基本用法
- Java.util.Date类型格式化输出和字符串转Date类型
- 用Java缓存机制创建更快的Web应用----基本用法
- java.util.vector中的vector的详细用法[转]
- java.util.vector中的vector的详细用法
- java.util.Formatter 详解
- java.util.regex的用法举例
- Adsutil.vbs基本用法及深入了解
- Java中格式化日期时间的类:SimpleDateFormat 用法详解
- ibatis中配置parameterClass="java.util.HashMap"的用法
- 题目为《java.util.Formatter 详解》的一篇博客地址
- java.util.List用法
- Adsutil.vbs基本用法
- 用Java缓存机制创建更快的Web应用----基本用法
- java.util.properties用法