##導言## 閱讀java util 包的源碼的時候,突然發現了,一個格式化類的使用,看完之後,發現,之前寫代碼太沒有思考了,copy 過來就來用,其實,若是,只是多瞭解一點的話,也算是給本身多一種方式.html
##一個簡單的例子## question 1java
我要輸出一個當前時間的年月日時間格式的字符串 <br/> 2013-04-28 22:20:12程序員
通常而言咱們可能會這麼幹api
SimpleDateFormat dateFormater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Calendar cal = Calendar.getInstance();
<br/>System.out.println(dateFormater.format(cal.getTime()));
oracle
不過,若是能是一個C語言程序員的話,確定會知道一個叫作格式化字符的機制,java很好的繼承了這點,而且把這個機制作了一個增強,不但支持常規類型 並且也支持日期類型編碼
System.out.println(String.format("%1$tF %1$tT", Calendar.getInstance()));
code
可能這段代碼不太好動,如同正則同樣那些複雜不太友好的字符,亮瞎了我們的眼,可是,相對於正則的博大精深,java Formatter 機制明顯簡單不少,也許上面的那個例子,並不能打動你,不過,若是你的代碼只須要進行字符的格式輸出的話,並不須要解析的話,而你又不怎麼熟悉正則的話,我推薦,java formatter 是你值得去了解使用的東西.雖然不是什麼高深的東西,可是的確很經常使用.orm
##語法簡講##htm
###格式說明符組成說明### 中括號標註([])的爲可選參數.繼承
%[argument_index$][flags][width][.precision]conversion <br/> %[參數索引][標識集][輸出寬度][.限制字符]標明如何格式化字符
%[argument_index$][flags][width]conversion <br/> conversion 是一個由兩字符組成的序列。第一個字符是 't' 或 'T'。第二個字符代表所使用的格式。
%[flags][width]conversion
###標識集(flags)### 在整個Formatter 讓我最難懂的就是標識集的用法.限制大,功能看上去不強大.
如下爲官方原檔
下表總結了受支持的標誌。y 表示該標誌受指示參數類型支持。 <br/>標誌 常規 字符 整數 浮點 日期/時間 說明
'-' y y y y y 結果將是左對齊的。
'#' y1 - y3 y - 結果應該使用依賴於轉換類型的替換形式
'+' - - y4 y - 結果老是包括一個符號
' ' - - y4 y - 對於正值,結果中將包括一個前導空格
'0' - - y y - 結果將用零來填充
',' - - y2 y5 - 結果將包括特定於語言環境的組分隔符
'(' - - y4 y5 - 結果將是用圓括號括起來的負數
1 取決於 Formattable 的定義。 <br/> 2 只適用於 'd' 轉換。 <br/> 3 只適用於 'o'、'x' 和 'X' 轉換。 <br/> 4 對 BigInteger 應用 'd'、'o'、'x' 和 'X' 轉換時,或者對 byte 及 Byte、short 及 Short、int 及 Integer、long 及 Long 分別應用 'd' 轉換時適用。 <br/> 5 只適用於 'e'、'E'、'f'、'g' 和 'G' 轉換。
內置有7個標識位,並且限制多多,後來通過一番折騰,終於發現,這個標識位其實最大的做用用於實現Formattable 接口使用.
舉一個使用場景:
例如符號數的顯示
String.format("%1$+d",1 )
<br/> 輸出+1
這個例子...不過,沒什麼特殊要求的話能夠忽略這個標識位的使用
###轉換類型###
常規 - 可應用於任何參數類型
字符 - 可應用於表示 Unicode 字符的基本類型:char、Character、byte、Byte、short 和 Short。當 Character.isValidCodePoint(int) 返回 true 時,可將此轉換應用於 int 和 Integer 類型
數值
- 整數 - 可應用於 Java 的整數類型:byte、Byte、short、Short、int、Integer、long、Long 和 BigInteger <br/>
- 浮點 - 可用於 Java 的浮點類型:float、Float、double、Double 和 BigDecimal
日期/時間 - 可應用於 Java 的、可以對日期或時間進行編碼的類型:long、Long、Calendar 和 Date。
百分比 - 產生字面值 '%' ('\u0025')
行分隔符 - 產生特定於平臺的行分隔符
更多參考源文檔java.util.Formatter
###附錄### 可能日期的格式化處理用得比較多,我就把api doc裏面的文檔直接複製過來
如下日期和時間轉換的後綴字符是爲 '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"。
任何未明肯定義爲轉換的字符都是非法字符,而且都被保留,以供未來擴展使用。