30 second

2010年8月19日 #

java字符串格式化

寻找将数字转化为定长字符串的方法,最终发现用String类的Format可以实现
示例:
int id = 0;
String id2 = String .format("%010d", id);  //前导置零,10位长度的字符串

函数原型:

format
public static String format(String format,
                            Object... args)
使用指定的格式字符串和参数返回一个格式化字符串。
始终使用 Locale.getDefault() 返回的语言环境。


参数:
format - 格式字符串
args - 格式字符串中由格式说明符引用的参数。如果还有格式说明符以外的参数,则忽略这些额外的参数。参数的数目是可变的,可以为 0。参数的最大数目受 Java Virtual Machine Specification 所定义的 Java 数组最大维度的限制。有关 null 参数的行为依赖于转换。
返回:
一个格式化字符串
抛出:
IllegalFormatException - 如果格式字符串中包含非法语法、与给定的参数不兼容的格式说明符,格式字符串给定的参数不够,或者存在其他非法条件。有关所有可能的格式化错误的规范,请参阅 formatter 类规范的详细信息 一节。
NullPointerException - 如果 format 为 null


 

一、第一个参数是格式化字符串,其语法:

1、常规类型、字符类型和数值类型的格式说明符的语法如下:
   %[argument_index$][flags][width][.precision]conversion

*可选的 argument_index 是一个十进制整数,用于表明参数在参数列表中的位置。第一个参数由 "1$" 引用,第二个参数由 "2$" 引用,依此类推。

*可选 flags 是修改输出格式的字符集。有效标志集取决于转换类型。

*可选 width 是一个非负十进制整数,表明要向输出中写入的最少字符数。

*可选 precision 是一个非负十进制整数,通常用来限制字符数。特定行为取决于转换类型。

*所需 conversion 是一个表明应该如何格式化参数的字符。给定参数的有效转换集取决于参数的数据类型。

2、用来表示日期和时间类型

   %[argument_index$][flags][width]conversion 

 
 *可选的 argument_index、flags 和 width 的定义同上。

*所需的 conversion 是一个由两字符组成的序列。第一个字符是 't' 或 'T'。第二个字符表明所使用的格式。这些字符类似于但不完全等同于那些由 GNU date 和 POSIX strftime(3c) 定义的字符。

3、与参数不对应的格式说明符的语法如下:

   %[flags][width]conversion


 可选 flags 和 width 的定义同上。

所需的 conversion 是一个表明要在输出中所插内容的字符。


二、语法中个元素对应的参数
1、标志(flags)

下表总结了受支持的标志。y 表示该标志受指示参数类型支持。
标志 常规 字符 整数 浮点 日期/时间 说明
'-' y y y y y 结果将是左对齐的。
'#' y1 - y3 y - 结果应该使用依赖于转换类型的替换形式
'+' - - y4 y - 结果总是包括一个符号
'  ' - - y4 y - 对于正值,结果中将包括一个前导空格
'0' - - y y - 结果将用零来填充
',' - - y2 y5 - 结果将包括特定于语言环境的组分隔符
'(' - - y4 y5 - 结果将是用圆括号括起来的负数

1 取决于 Formattable 的定义。

2 只适用于 'd' 转换。

3 只适用于 'o''x''X' 转换。

4BigInteger 应用 'd''o''x''X' 转换时,或者对 byteByteshortShortintIntegerlongLong 分别应用 'd' 转换时适用。

5 只适用于 'e''E''f''g''G' 转换。

任何未显式定义为标志的字符都是非法字符,并且都被保留,以供扩展使用。


**String id2 = String .format("%010d", id); 其中引号内第一个0便是用零填充,

2、宽度(width)

宽度是将向输出中写入的最少字符数。对于行分隔符转换,不适用宽度,如果提供宽度,则会抛出异常。

3、精度(precision)

对于常规参数类型,精度是将向输出中写入的最多字符数。

对于浮点转换 'e''E''f',精度是小数点分隔符后的位数。如果转换是 'g''G',那么精度是舍入计算后所得数值的所有位数。如果转换是 'a''A',则不必指定精度。

对于字符、整数和日期/时间参数类型转换,以及百分比和行分隔符转换,精度是不适用的;如果提供精度,则会抛出异常。



4、转换(conversion)

下表总结了受支持的转换。由大写字符(如 'B''H''S''C''X''E''G''A''T')表示的转换与由相应的小写字符的转换等同,根据流行的 Locale 规则将结果转换为大写形式除外。后者等同于 String.toUpperCase() 的以下调用

    out.toUpperCase() 

转换 参数类别 说明
'b', 'B' 常规 如果参数 argnull,则结果为 "false"。如果 arg 是一个 boolean 值或 Boolean,则结果为 String.valueOf() 返回的字符串。否则结果为 "true"。
'h', 'H' 常规 如果参数 argnull,则结果为 "null"。否则,结果为调用 Integer.toHexString(arg.hashCode()) 得到的结果。
's', 'S' 常规 如果参数 argnull,则结果为 "null"。如果 arg 实现 Formattable,则调用 arg.formatTo。否则,结果为调用 arg.toString() 得到的结果。
'c', 'C' 字符 结果是一个 Unicode 字符
'd' 整数 结果被格式化为十进制整数
'o' 整数 结果被格式化为八进制整数
'x', 'X' 整数 结果被格式化为十六进制整数
'e', 'E' 浮点 结果被格式化为用计算机科学记数法表示的十进制数
'f' 浮点 结果被格式化为十进制数
'g', 'G' 浮点 根据精度和舍入运算后的值,使用计算机科学记数形式或十进制格式对结果进行格式化。
'a', 'A' 浮点 结果被格式化为带有效位数和指数的十六进制浮点数
't', 'T' 日期/时间 日期和时间转换字符的前缀。请参阅日期/时间转换
'%' 百分比 结果为字面值 '%' ('\u0025')
'n' 行分隔符 结果为特定于平台的行分隔符

任何未明确定义为转换的字符都是非法字符,并且都被保留,以供将来扩展使用

此外还有日期格式的转换,在此不列出。
(以上来源于JDK1.6)

posted @ 2010-08-19 16:35 xyan 阅读(5689) | 评论 (0)编辑 收藏

仅列出标题