JDK1.5中java.util.Formatter类的学习探究和使用

    链接地址:http://www.xx566.com/detail/105.html

    在JDK1.5中,String类新增了两个很有用的静态方法:format(String format,Object... args);format(Locale l, String format, Object... args) 用来进行字符串的格式化,查看源代码,发现调用了Formatter.format()方法,Formatter是JDK1.5提供的格式化输出类,与C语言printf风格相似,用于对具备一定格式的字符串进行识别和转换输出。

    我们首先来看这样一个示例,在Java开发中,我们经常需要格式化日期输出,请阅读下面代码

package javase;
 
import java.text.SimpleDateFormat;
import java.util.Calendar;
 
public class FormatTest {
     
    public static void main(String[] args) {
         
        Calendar cal = Calendar.getInstance();
 
        //这里我们可以通过SimpleDateFormat格式化日期输出
        SimpleDateFormat dateFormater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println(dateFormater.format(cal.getTime()));
         
        //在看完本篇文章后,我们可以这么做
        System.out.println(String.format("%1$tY-%1$tm-%1$te %1$tk:%1$tM:%1$tS", cal));
         
        //也可以这么做
        System.out.println(String.format("%1$tY-%<tm-%<te %<tk:%<tM:%<tS", cal));
 
        //还可以这么做
        System.out.println(String.format("%1$tF %1$tT", cal));
         
    }
     
}

    上面的输出得到的是同样的结果,有没有很惊奇(至少我第一次使用时觉得好奇妙),下面我们来学习一下为什么。产生格式化输出的每个方法都需要格式字符串(包含固定文本以及一个或多个嵌入的格式说明符的String)和参数列表,我们来看一下格式字符串的语法涵义。

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$tY-%1$tm-%1$te %1$tk:%1$tM:%1$tS’,其中t代表转换,转换可分为以下几类 

 1. 常规 - 可应用于任何参数类型 

2. 字符 - 可应用于表示 Unicode 字符的基本类型:char、Character、byte、Byte、short 和 Short。当 Character.isValidCodePoint(int) 返回 true 时,可将此转换应用于 int 和 Integer 类型 
3. 数值 
      1. 整数 - 可应用于 Java 的整数类型:byte、Byte、short、Short、int、Integer、long、Long 和 BigInteger 
      2. 浮点 - 可用于 Java 的浮点类型:float、Float、double、Double 和 BigDecimal 
4. 日期/时间 - 可应用于 Java 的、能够对日期或时间进行编码的类型:long、Long、Calendar 和 Date。 
5. 百分比 - 产生字面值 '%' ('\u0025') 
6. 行分隔符 - 产生特定于平台的行分隔符

 以下转换字符用来格式化时间:

'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。

  

    另外:根据位置引用参数的另一种方法是使用 '<' ('\u003c') 标志,这将会重用以前格式说明符的参数。如本例中‘%1$tY-%<tm-%’

    更多知识,请参阅:http://docs.oracle.com/javase/7/docs/api/java/util/Formatter.html

你可能感兴趣的:(java,格式化,fomatter)