天天看點

Formatter(格式化)

簡述:(格式化的概述)

對于一般字元、數字的格式修飾的格式:%[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,會抛出

FormatFlagsConversionMismatchException

'B' 'b'的大寫
'h' 傳回對象的哈希碼。若參數為null,結果為null。否則結果為Integer.toHexString(arg.hashCode())
'H' 'h'的大寫
's' 參數為null結果為null,若參數實作了Formattable,會調用arg.formatTo,否則結果為arg.toString()。若給定了'#'flag但是arg不是一個Formattable,會抛出

FormatFlagsConversionMismatchException

'S' 's'的大寫

可以應用給通用conversion的flag

'-' 左對齊,若沒有width,會抛出

MissingFormatWidthException

'#' 一個交換形式的輸出, 形式的指定通過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,會抛出

FormatFlagsConversionMismatchException

'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'會填充在負号與值之間,若又給定了'#',會抛出

FormatFlagsConversionMismatchException

'o' 格式化為八進制,不能應用本地算法,若給定了'#'flag,輸出會有'0',若給定了'0'flag,輸出就會在訓示符'0'與值之間填充零,若給定了'('、'+'或',',會抛出

FormatFlagsConversionMismatchException

'x' 格式化為十六進制,不能應用本地算法,若給定了'#'flag,輸出會有'0',若給定了'0'flag,輸出就會在訓示符'0'與值之間填充零,若給定了'('、'+'或',',會抛出

FormatFlagsConversionMismatchException

'X' 'x‘的大寫

如果conversion是'o','x'或'X'并且同時給出了'#'flag和'0'flag,結果将會包含基數訓示符(八進制是'0',十六進制是'0x')、一些零和數值。

 若沒有給定'-'flag,會在符号前填充空格。

 flag(應用在數值積分conversion上)

'+' 結果有符号,如果還給定了' 'flag,會抛出

IllegalFormatFlagsException

' ' 正數前有一個空格,負數前有負号,若還給定了'+'flag,會抛出

IllegalFormatFlagsException

'0' 當不是NaN和inifinity時,輸出時在符号或基數後面填充零,若未給定width,會抛出MissingFormatWidthException,若還給定了'-'flag,會抛出IllegalFormatFlagsException
',' 每組數之間用','分隔
'(' 若值是負數,該值放在()内

 若未給定flag,預設的flag如下:

       在width内右對齊

       負數前有負号

       正數和零前不包含任何符号和空格

       沒有組分隔符

width的長度包含了符号、數字、基數符号、組分隔符和'('

precision不可用,否則抛出

IllegalFormatPrecisionException

BigInteger

conversion

'd' 格式化為十進制,可以應用本地算法,若又給定了'#',會抛出

FormatFlagsConversionMismatchException

'o' 格式化為八進制,不能應用本地算法,若值大于等于零,結果會有正号,若給定了'#'flag,輸出會有基數訓示符'0',若給定了'0'flag,輸出就會在訓示符'0'與值之間填充零,若給定',',會抛出

FormatFlagsConversionMismatchException

'x' 格式化為十六進制,不能應用本地算法,若值大于等于零,結果會有正号,若給定了'#'flag,輸出會有'0',若給定了'0'flag,輸出就會在訓示符'0'與值之間填充零,若給定了',',會抛出

FormatFlagsConversionMismatchException

'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'的大寫形式