簡述:(格式化的概述)
對于一般字元、數字的格式修飾的格式:%[argument_index$][flags][width][.precision]conversion
argument_index$:指定參數在參數清單中的位置
flags:修改輸出的字元集,其值取決于conversion
width:指定輸出字元的寬度
precision:指定字元的長度,具體取決于conversion conversion:指定格式怎麼樣轉換的訓示字元
conversion的選擇(小寫時結果是小寫,大寫時是大寫)
'b','B' | 參數是null或false時,結果為false,其餘為true |
'h','H' | 參數為null結果為null,否則結果為Integer.toHexString(arg.hashCode()) |
's','S' | 參數為null結果為null,若參數實作了Formattable,會調用arg.formatTo,否則結果為arg.toString() |
'c','C' | 結果格式化為字元 |
'd' | 結果格式化為十進制整數 |
'o' | 結果格式化為八進制整數 |
'x','X' | 結果格式化為十六進制整數 |
'e','E' | 結果格式化為用計算機科學計數表示法的十進制數 |
'f' | 結果格式化為十進制浮點數,參數必須是浮點數 |
'g','G' | 根據具體情況,自動選擇計算機科學計數表示法還是十進制數 |
'a','A' | 結果被格式化為帶有效位數和指數的十六進制浮點數 |
't','T' | 日期和時間的字首 |
'%' | 結果是% |
'n' | 換行 |
對于日期時間的格式修飾的格式:%[argument_index$][flags][width]conversion
參數說明如上
conversion的選擇(time)
'H' | 24小時制,00-23 |
'I' | 12小時制,01-12 |
'k' | 24小時制,0-23 |
'l'(L的小寫) | 12小時制,1-12 |
'M' | 分鐘,00-59 |
'S' | 秒,00-60 |
'L' | 毫秒,000-999 |
'N' | 納秒,000000000-999999999 |
'p' | 特定于區域的字首,am和pm |
'z' | 相對于 GMT 的 RFC 822 格式的數字時區偏移量,例如 -0800 |
'Z' | 表示時區縮寫形式的字元串。Formatter 的語言環境将取代參數的語言環境(如果有) |
's' | 從1970年1月1日00:00:00到現在的秒數 |
'Q' | 從1970年1月1日00:00:00到現在的納秒數 |
conversion的選擇(date)
'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' | 一年的某一天,000-366 |
'm' | 月份,01-13 |
'd' | 一月的某天,01-31 |
'e' | 一月的某天,1-31 |
conversion的選擇(date/time)
'R' | 時間格式化為24小時制:%tH:%tM |
'T' | 時間格式化為24小時制:%tH:%tM:%tS |
'r' | 時間格式化為12小時制:%tI:%tM:%S:%Tp |
'D' | 格式化為:%tm/%td/%ty |
'F' | 格式化為:%tY-%tm-%td |
'c' | 格式化為:%ta %tb %td %tT %tZ %tY,如:Sun Jul 20 16:17:00 EDT 1969 |
Flag(可以有多個)
'-' | 在最小寬度内左對齊,不可以與“用0填充”同時使用 |
'#' | 隻适用于8進制和16進制,8進制時在結果前面增加一個0,16進制時在結果前面增加0x |
'+' | 結果有符号 |
' ' | 正值前加空格,負值前加負号(一般情況下隻适用于10進制,若對象為BigInteger才可以用于8進制和16進制) |
'0' | 結果用0填充 |
',' | 隻适用于10進制,每3位數字之間用“,”分隔 |
'(' | 若參數是負數,則結果中不添加負号而是用圓括号把數字括起來(同‘+’具有同樣的限制) |
詳述:
(格式化的詳述)
異常:
所有字元沒有conversion、date/time conversion字首或flag被忽略了并被保留以後的擴充,會引起
UnknownFormatConversionException
或
UnknownFormatFlagsException
異常
如果width或precision沒有合法的參數,會抛出
IllegalFormatWidthException
或
IllegalFormatPrecisionException
如果conversion的參數不合法,胡抛出
IllegalFormatConversionException
通用conversion
'b' | 傳回Boolean.toString(boolean)。若參數為null或false,結果為false,其餘為true。若給定了'#'flag,會抛出 |
'B' | 'b'的大寫 |
'h' | 傳回對象的哈希碼。若參數為null,結果為null。否則結果為Integer.toHexString(arg.hashCode()) |
'H' | 'h'的大寫 |
's' | 參數為null結果為null,若參數實作了Formattable,會調用arg.formatTo,否則結果為arg.toString()。若給定了'#'flag但是arg不是一個Formattable,會抛出 |
'S' | 's'的大寫 |
可以應用給通用conversion的flag
'-' | 左對齊,若沒有width,會抛出 |
'#' | 一個交換形式的輸出, 形式的指定通過conversion指定. |
width指定轉換的字元床的最小字元輸出長度,若小于width,小于width的部分會被' '(空格)替代,直到長度為width。預設填充在左邊,若給定了'-'flag,則填充在右邊。若沒有指定width,字元串的長度就沒有最小值。
precision指定了輸出的最大的字元數。precision優先于width。
Character
應用于char和Character,當Character.isValidCodePoint(int)傳回true,也可以應用于byte、Byte、short、Short、int、Integer,當Character.isValidCodePoint(int)傳回false,會抛出
IllegalFormatCodePointException
'c' | 格式化參數為Unicode碼,若給定了'#'flag,會抛出 |
'C' | 'c'的大寫形式 |
此時的'-'同通用conversion時的flag,若給定了'#',會抛出FormatFlagsConversionMismatchException。
此時的width同通用conversion時的flag,而precision不可用,否則抛出
IllegalFormatPrecisionException
Numeric
Numeric的conversion有四種分類
1、Byte、Short、Integer、Long
2、BigInteger
3、Float、Double
4、BigDecimal
數字的本地化算法
數字有整數部分、小數部分和指數部分,此時可以應用下面的轉換:
1、字元串中的數字字元會被計算好的相對于目前本地的零數字(zero digit)替換
2、若十進制分隔符是%,就會替換一個特定于本地的十進制分隔符
3、若給定了','flag,就會在數字當中按照組大小(group size)插入','
4、若給定了'0'flag,就會插入到數字的最後或數字的開頭,直到長度等于width
5、如果是負數并且給定了'('flag,那麼會在數字開頭加'(',數字結尾加')'
6、如果是負數(或-0.0)但是沒有給定'('flag,那麼會在數字結果開頭加'-'
7、若給定了'+'并且是整數或0(或0.0),那麼會在結果前加'+'
如果給定的值是NaN或是正無窮大值,相應的會傳回 "NaN“ 或 "Infinity“。如果是負無窮大且給定了'('flag,則傳回 "(Infinity)",否則輸出 "-Infinity"。
Byte、Short、Integer and Long
conversion(byte,Byte,short,Short,int,Integer,long,Long)
'd' | 格式化為十進制,可以應用本地算法,若給定了'0'flag,且為負值,'0'會填充在負号與值之間,若又給定了'#',會抛出 |
'o' | 格式化為八進制,不能應用本地算法,若給定了'#'flag,輸出會有'0',若給定了'0'flag,輸出就會在訓示符'0'與值之間填充零,若給定了'('、'+'或',',會抛出 |
'x' | 格式化為十六進制,不能應用本地算法,若給定了'#'flag,輸出會有'0',若給定了'0'flag,輸出就會在訓示符'0'與值之間填充零,若給定了'('、'+'或',',會抛出 |
'X' | 'x‘的大寫 |
如果conversion是'o','x'或'X'并且同時給出了'#'flag和'0'flag,結果将會包含基數訓示符(八進制是'0',十六進制是'0x')、一些零和數值。
若沒有給定'-'flag,會在符号前填充空格。
flag(應用在數值積分conversion上)
'+' | 結果有符号,如果還給定了' 'flag,會抛出 |
' ' | 正數前有一個空格,負數前有負号,若還給定了'+'flag,會抛出 |
'0' | 當不是NaN和inifinity時,輸出時在符号或基數後面填充零,若未給定width,會抛出MissingFormatWidthException,若還給定了'-'flag,會抛出IllegalFormatFlagsException |
',' | 每組數之間用','分隔 |
'(' | 若值是負數,該值放在()内 |
若未給定flag,預設的flag如下:
在width内右對齊
負數前有負号
正數和零前不包含任何符号和空格
沒有組分隔符
width的長度包含了符号、數字、基數符号、組分隔符和'('
precision不可用,否則抛出
IllegalFormatPrecisionException
BigInteger
conversion
'd' | 格式化為十進制,可以應用本地算法,若又給定了'#',會抛出 |
'o' | 格式化為八進制,不能應用本地算法,若值大于等于零,結果會有正号,若給定了'#'flag,輸出會有基數訓示符'0',若給定了'0'flag,輸出就會在訓示符'0'與值之間填充零,若給定',',會抛出 |
'x' | 格式化為十六進制,不能應用本地算法,若值大于等于零,結果會有正号,若給定了'#'flag,輸出會有'0',若給定了'0'flag,輸出就會在訓示符'0'與值之間填充零,若給定了',',會抛出 |
'X' | 'x‘的大寫 |
如果conversion是'o','x'或'X'并且同時給出了'#'flag和'0'flag,結果将會包含基數訓示符(八進制是'0',十六進制是'0x')、一些零和數值。
如果值是負數且有'0'flag,'0'會填充在符号與數值之間。
width的長度包含了符号、數字、基數符号、組分隔符和'('
precision不可用,否則抛出
IllegalFormatPrecisionException
Float和Double
conversion
'e' | 結果為計算機科學計數表示法,本地算法有效,若值為NaN或infinity,結果是'NaN'或'Infinity',若值為+0或-0,指數就是+00, |
'E' | 'e'的大寫形式 |
'g' | 根據具體情況,自動選擇計算機科學計數表示法還是十進制數 |
'G' | 'g'的大寫形式 |
'f' | 結果格式化為十進制浮點數 |
'a' | 結果被格式化為帶有效位數和指數的十六進制浮點數 |
'A' | 'a'的大寫形式 |