給定規則:html
要想按照本身的想法格式化必須事先編寫一個規則。那這個規則要怎麼編寫?java
1.常規類型、字符類型和數值類型的格式說明符的語法以下:正則表達式
%[argument_index$][flags][width][.precision]conversion工具
2.用來表示日期和時間類型的格式說明符的語法以下:編碼
%[argument_index$][flags][width]conversionspa
3.與參數不對應的格式說明符的語法以下:.net
%[flags][width]conversioncode
API中有這樣三種規則,很顯然第一個規則的內容是最全面的。其它規則的內容和第一規則的內容有重複,那單說第一規則內容,其它規則依次類推。orm
注意:規則一中的precision前面要加英文句號「.」htm
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 |
- |
結果將是用圓括號括起來的負數 |
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')
行分隔符- 產生特定於平臺的行分隔符
常規 |
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%])";
總結: