JAVA String.format方法使用介绍 |
在JDK1.5中,String类增加了一个十分有用的静态函数format(String format, Objece... argues), 可以将各类数据 格局化为字符串并输出 。其中format参数指定了输出的 格局,是最复杂也是最难 主宰的丝毫,而argues则是一系列等 待被 格局化的对象 。该函数对c语言中printf函数的用法进行了 定然的摹仿, 因此有c语言 根底的人学起来会轻松许多 。下面我们着重 探讨一下format 参数的 格局及 含意 。 format参数中 可以包括不需求转化的字符串,这些字符串是你写什么,最终就输出什么 。同时还包括一些特殊 格局的内容,来指定将哪个对象来转换,以及转 换成什么 模式 。这种特殊的 格局 通通以%index$开头,index从1开始取值, 示意将第index个参数拿进来进行 格局化 。这丝毫比c语言要强丝毫, c语言不得不依照参数的顺序 顺次 格局化,而java 可以 取舍第n个参数来 格局化 。因为该函数 可以对任意一个对象进行 格局化,不同的对象 实用的参数也不同,因 此我们下面分类来 探讨 。 1.对整数进行 格局化:%[index$][标识][最小宽度]转换 模式 我们 可以看到, 格局化字符串由4 部分构成,其中%[index$]的 含意我们上面已经讲过,[最小宽度]的 含意也很好 了解,便是最终该整数转化的字符串 起码包括多少位数字 。我们来看看剩下2个 部分的 含意吧: 标识: '-' 在最小宽度内左对齐,不 可以与“用0填充”同时 使用 '#' 只 实用于8进制和16进制,8进制时在 后果前面增加一个0,16进制时在 后果前面增加0x '+' 后果总是包括一个符号(一般状况下只 实用于10进制,若对象为BigInteger才 可以用于8进制和16进制) ' ' 正值前加空格,负值前加负号(一般状况下只 实用于10进制,若对象为BigInteger才 可以用于8进制和16进制) '0' 后果将用零来填充 ',' 只 实用于10进制,每3位数字中间用“,”分隔 '(' 若参数是负数,则 后果中不增加负号而是用圆括号把数字括起来(同‘+’ 存在同样的 制约) 转换 模式: d-十进制 o-八进制 x或X-十六进制 上面的 注明过于 单调,我们来看几个具体的例子 。需求特殊 留神的丝毫是:大 部分标识字符 可以同时 使用 。 System.out.println(String.format("%1$,09d", -3123)); System.out.println(String.format("%1$9d", -31)); System.out.println(String.format("%1$-9d", -31)); System.out.println(String.format("%1$(9d", -31)); System.out.println(String.format("%1$#9x", 5689)); // 后果为: //-0003,123 // -31 //-31 // (31) // 0x1639 2.对浮点数进行 格局化:%[index$][标识][ 起码宽度][.精度]转换 模式 我们 可以看到,浮点数的转换多了一个“精度”选项, 可以操纵小数点后面的位数 。 标识: '-' 在最小宽度内左对齐,不 可以与“用0填充”同时 使用 '+' 后果总是包括一个符号 ' ' 正值前加空格,负值前加负号 '0' 后果将用零来填充 ',' 每3位数字中间用“,”分隔(只 实用于fgG的转换) '(' 若参数是负数,则 后果中不增加负号而是用圆括号把数字括起来(只 实用于eEfgG的转换) 转换 模式: 'e', 'E' -- 后果被 格局化为用计算机科学记数法 示意的十进制数 'f' -- 后果被 格局化为十进制一般 示意 模式 'g', 'G' -- 依据具体状况,自动 取舍用一般 示意 模式还是科学计数法 模式 'a', 'A' -- 后果被 格局化为带有效位数和指数的十六进制浮点数 3.对字符进行 格局化: 对字符进行 格局化是十分 方便的,c 示意字符,标识中'-' 示意左对齐, 其余就没什么了 。 4.对百分比符号进行 格局化: 看了上面的 注明,大家会发现百分比符号“%”是特殊 格局的一个前缀 。那么我们要输入一个百分比符号该怎么办呢? 确定是需求转义字符的,然而要 留神的是,在这里转义字符不是“”,而是“%” 。换句话说,下面这条语句 可以输出一个“12%”: System.out.println(String.format("%1$d%%", 12)); 5. 获得平台独立的行分隔符: System.getProperty("line.separator") 可以 获得平台独立的行分隔符,然而用在format中间未免显得过于 繁琐了 。于是format函数自带了一个平台独立的行分隔符那便是String.format("%n") 。 6.对日期类型进行 格局化: 以下日期和 工夫转换的后缀字符是为 't' 和 'T' 转换定义的 。这些类型 类似于但不 彻底等同于那些由 GNU date 和 POSIX strftime(3c) 定义的类型 。提供 其余转换类型是为了 拜访特定于 Java 的 性能(如将 'L' 用作秒中的毫秒) 。 以下转换字符用来 格局化 工夫: 'H' 24 小时制的小时,被 格局化为必要时带前导零的两位数,即 00 - 23 。 'I' 12 小时制的小时,被 格局化为必要时带前导零的两位数,即 01 - 12 。 'k' 24 小时制的小时,即 0 - 23 。 'l' 12 小时制的小时,即 1 - 12 。 'M' 小时中的分钟,被 格局化为必要时带前导零的两位数,即 00 - 59 。 'S' 分钟中的秒,被 格局化为必要时带前导零的两位数,即 00 - 60 ("60" 是 支撑闰秒所需的一个特殊值) 。 'L' 秒中的毫秒,被 格局化为必要时带前导零的三位数,即 000 - 999 。 'N' 秒中的毫微秒,被 格局化为必要时带前导零的九位数,即 000000000 - 999999999 。 'p' 特定于语言环境的 上午或下午 标记以小写 模式 示意,例如 "am" 或 "pm" 。 使用转换前缀 'T' 可以强 即将此输出转换为大写 模式 。 'z' 有关于 GMT 的 RFC 822 格局的数字时区偏移量,例如 -0800 。 'Z' 示意时区缩写 模式的字符串 。Formatter 的语言环境将取代参数的语言环境(假如有) 。 's' 自协调世界时 (UTC) 1970 年 1 月 1 日 00:00:00 至现在所 通过的秒数,即 Long.MIN_VALUE/1000 与 Long.MAX_VALUE/1000 中间的差值 。 'Q' 自协调世界时 (UTC) 1970 年 1 月 1 日 00:00:00 至现在所 通过的毫秒数,即 Long.MIN_VALUE 与 Long.MAX_VALUE 中间的差值 。 以下转换字符用来 格局化日期: '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' 一年中的天数,被 格局化为必要时带前导零的三位数,例如,关于格里高利历是 001 - 366 。 'm' 月份,被 格局化为必要时带前导零的两位数,即 01 - 13 。 'd' 一个月中的天数,被 格局化为必要时带前导零两位数,即 01 - 31 'e' 一个月中的天数,被 格局化为两位数,即 1 - 31 。 以下转换字符用于 格局化常见的日期/ 工夫组合 。 'R' 24 小时制的 工夫,被 格局化为 "%tH:%tM" 'T' 24 小时制的 工夫,被 格局化为 "%tH:%tM:%tS" 。 'r' 12 小时制的 工夫,被 格局化为 "%tI:%tM:%tS %Tp" 。上午或下午标记 ('%Tp') 的位置可能与语言环境有关 。 'D' 日期,被 格局化为 "%tm/%td/%ty" 。 'F' ISO 8601 格局的 完全日期,被 格局化为 "%tY-%tm-%td" 。 'c' 日期和 工夫,被 格局化为 "%ta %tb %td %tT %tZ %tY",例如 "Sun Jul 20 16:17:00 EDT 1969" 。 |