Java學習筆記之Formatter的用法詳解(輸出格式化)


java.util.Formatter (摘自sun主頁)

Implements: Closeable, Flushable


printf 風格的格式字符串的解釋程序。此類提供了對布局對齊和排列的支持,以及對數值、字符串和日期/時間數據的常規格式和特定於語言環境的輸出的支持。支持諸如 byteBigDecimalCalendar 等常見 Java 類型。任意用戶類型的受限格式化定制都是通過 Formattable接口提供的。

Formatter 對於多線程訪問而言沒必要是安全的。線程安全是可選的,它對此類中的方法用戶負責。

Java 語言的格式化輸出在很大程度上受到 C 語言 printf的啟發。雖然一些格式字符串與 C 類似,但已進行了某些定制,以適應 Java 語言,並且利用了其中一些特性。此外,Java 的格式比 C 的格式更嚴格;例如,如果轉換與標志不兼容,則會拋出異常。在 C 中,不適用的標志會被忽略。這樣,便於 C 程序員識別這些格式字符串,而又不必與 C 中的那些標志完全兼容。

所期望用法的示例:

 
   StringBuilder sb = new StringBuilder();
   // Send all output to the Appendable object sb
   Formatter formatter = new Formatter(sb, Locale.US);
 
   // Explicit argument indices may be used to re-order output.
   formatter.format("%4$2s %3$2s %2$2s %1$2s", "a", "b", "c", "d")
   // -> " d  c  b  a"
 
   // Optional locale as the first argument can be used to get
   // locale-specific formatting of numbers.  The precision and width can be
   // given to round and align the value.
   formatter.format(Locale.FRANCE, "e = %+10.4f", Math.E);
   // -> "e =    +2,7183"
 
   // The '(' numeric flag may be used to format negative numbers with
   // parentheses rather than a minus sign.  Group separators are
   // automatically inserted.
   formatter.format("Amount gained or lost since last statement: $ %(,.2f",
                    balanceDelta);
   // -> "Amount gained or lost since last statement: $ (6,217.58)"
 

常見格式化請求的便捷方法是按照如下調用格式來闡明的:

 
   // Writes a formatted string to System.out.
   System.out.format("Local time: %tT", Calendar.getInstance());
   // -> "Local time: 13:34:18"
 
   // Writes formatted output to System.err.
   System.err.printf("Unable to open file '%1$s': %2$s",
                     fileName, exception.getMessage());
   // -> "Unable to open file 'food': No such file or directory"
 

與 C 語言的 sprintf(3) 類似,可以使用靜態方法 String#format(String,Object...)String.format來格式化 Strings:

 
   // Format a string containing a date.
   import java.util.Calendar;
   import java.util.GregorianCalendar;
   import static java.util.Calendar.*;
 
   Calendar c = new GregorianCalendar(1995, MAY, 23);
   String s = String.format("Duke's Birthday: %1$tm %1$te,%1$tY", c);
   // -> s == "Duke's Birthday: May 23, 1995"
 

結構

此規范分為兩部分。第一部分是摘要,包括基本的格式概念。這一部分是為那些想要快速入門並熟悉其他編程語言的格式化輸出的用戶准備的。第二部分是詳細信息,包括具體的實現細節。它是為那些需要更精確格式化行為規范的用戶准備的。

摘要

這一部分將提供對格式概念的簡單概述。有關精確的行為細節,請參閱詳細信息部分。

格式字符串語法

產生格式化輸出的每個方法都需要格式字符串參數列表。格式字符串是一個 String,它可以包含固定文本以及一個或多個嵌入的格式說明符。請考慮以下示例:

 
   Calendar c = ...;
   String s = String.format("Duke's Birthday: %1$tm %1$te,%1$tY", c);
 

此格式字符串是 format 方法的第一個參數。它包含三個格式說明符 "%1$tm"、"%1$te" 和 "%1$tY",它們指出應該如何處理參數以及在文本的什么地方插入它們。格式字符串的其余部分是包括 "Dukes Birthday: " 和其他任何空格或標點符號的固定文本。 參數列表由傳遞給位於格式字符串之后的方法的所有參數組成。在上述示例中,參數列表的大小為 1,由對象 Calendar c組成。

  • 常規類型、字符類型和數值類型的格式說明符的語法如下:
     
       %[argument_index$][flags][width][.precision]conversion
     

    可選的 argument_index 是一個十進制整數,用於表明參數在參數列表中的位置。第一個參數由 "1$" 引用,第二個參數由 "2$" 引用,依此類推。

    可選 flags是修改輸出格式的字符集。有效標志集取決於轉換類型。

    可選 width是一個非負十進制整數,表明要向輸出中寫入的最少字符數。

    可選 precision是一個非負十進制整數,通常用來限制字符數。特定行為取決於轉換類型。

    所需 conversion是一個表明應該如何格式化參數的字符。給定參數的有效轉換集取決於參數的數據類型。

  • 用來表示日期和時間類型的格式說明符的語法如下:
     
       %[argument_index$][flags][width]conversion
     

    可選的 argument_indexflagswidth的定義同上。

    所需的 conversion 是一個由兩字符組成的序列。第一個字符是 't''T'。第二個字符表明所使用的格式。這些字符類似於但不完全等同於那些由 GNU date 和 POSIX strftime(3c)定義的字符。

  • 與參數不對應的格式說明符的語法如下:
     
       %[flags][width]conversion
     

    可選 flagswidth的定義同上。

    所需的 conversion 是一個表明要在輸出中所插內容的字符。

轉換

轉換可分為以下幾類:

  1. 常規- 可應用於任何參數類型
  2. 字符 - 可應用於表示 Unicode 字符的基本類型:charCharacterbyteByteshortShort。當 Character#isValidCodePoint 返回 true 時,可將此轉換應用於 intInteger類型
  3. 數值
    1. 整數 - 可應用於 Java 的整數類型:byteByteshortShortintIntegerlongLongBigInteger
    2. 浮點 - 可用於 Java 的浮點類型:floatFloatdoubleDoubleBigDecimal
  4. 日期/時間 - 可應用於 Java 的、能夠對日期或時間進行編碼的類型:longLongCalendarDate
  5. 百分比 - 產生字面值 '%' ('%')
  6. 行分隔符 - 產生特定於平台的行分隔符

下表總結了受支持的轉換。由大寫字符(如 'B''H''S''C''X''E''G''A''T')表示的轉換與由相應的小寫字符的轉換等同,根據流行的 Locale 規則將結果轉換為大寫形式除外。后者等同於 String#toUpperCase()的以下調用

 
    out.toUpperCase() 
轉換參數類別說明'b', 'B'常規如果參數 argnull,則結果為 "false"。如果 arg 是一個 boolean 值或 Boolean,則結果為 String.valueOf()返回的字符串。否則結果為 "true"。'h', 'H'常規如果參數 argnull,則結果為 "null"。否則,結果為調用 Integer.toHexString(arg.hashCode())得到的結果。's', 'S'常規如果參數 argnull,則結果為 "null"。如果 arg 實現 Formattable,則調用 arg.formatTo。否則,結果為調用 arg.toString()得到的結果。'c', 'C'字符結果是一個 Unicode 字符'd'整數結果被格式化為十進制整數'o'整數結果被格式化為八進制整數'x', 'X'整數結果被格式化為十六進制整數'e', 'E'浮點結果被格式化為用計算機科學記數法表示的十進制數'f'浮點結果被格式化為十進制數'g', 'G'浮點根據精度和舍入運算后的值,使用計算機科學記數形式或十進制格式對結果進行格式化。'a', 'A'浮點結果被格式化為帶有效位數和指數的十六進制浮點數't', 'T'日期/時間日期和時間轉換字符的前綴。請參閱日期/時間轉換'%'百分比結果為字面值 '%' ('%')'n'行分隔符結果為特定於平台的行分隔符

任何未明確定義為轉換的字符都是非法字符,並且都被保留,以供將來擴展使用。

日期/時間轉換

以下日期和時間轉換的后綴字符是為 '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/1000Long.MAX_VALUE/1000之間的差值。'Q'自協調世界時 (UTC) 1970 年 1 月 1 日 00:00:00 至現在所經過的毫秒數,即 Long.MIN_VALUELong.MAX_VALUE 之間的差值。

以下轉換字符用來格式化日期:

'B'特定於語言環境的月份全稱,例如 "January""February"'b'特定於語言環境的月份簡稱,例如 "Jan""Feb"'h''b'相同。'A'特定於語言環境的星期幾全稱,例如 "Sunday""Monday"'a'特定於語言環境的星期幾簡稱,例如 "Sun""Mon"'C'除以 100 的四位數表示的年份,被格式化為必要時帶前導零的兩位數,即 00 - 99'Y'年份,被格式化為必要時帶前導零的四位數(至少),例如,0092 等於格里高利歷的 92CE。'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"

任何未明確定義為轉換的字符都是非法字符,並且都被保留,以供將來擴展使用。

標志

下表總結了受支持的標志。y表示該標志受指示參數類型支持。

標志常規字符整數浮點日期/時間說明'-'yyyyy結果將是左對齊的。'#'y1-y3y-結果應該使用依賴於轉換類型的替換形式'+'--y4y-結果總是包括一個符號'  '--y4y-對於正值,結果中將包括一個前導空格'0'--yy-結果將用零來填充','--y2y5-結果將包括特定於語言環境的組分隔符'('--y4y5-結果將是用圓括號括起來的負數

1 取決於 Formattable的定義。

2 只適用於 'd'轉換。

3 只適用於 'o''x''X'轉換。

4BigInteger 應用 'd''o''x''X' 轉換時,或者對 byteByteshortShortintIntegerlongLong 分別應用 'd'轉換時適用。

5 只適用於 'e''E''f''g''G'轉換。

任何未顯式定義為標志的字符都是非法字符,並且都被保留,以供擴展使用。

寬度

寬度是將向輸出中寫入的最少字符數。對於行分隔符轉換,不適用寬度,如果提供寬度,則會拋出異常。

精度

對於常規參數類型,精度是將向輸出中寫入的最多字符數。

對於浮點轉換 'e''E''f',精度是小數點分隔符后的位數。如果轉換是 'g''G',那么精度是舍入計算后所得數值的所有位數。如果轉換是 'a''A',則不必指定精度。

對於字符、整數和日期/時間參數類型轉換,以及百分比和行分隔符轉換,精度是不適用的;如果提供精度,則會拋出異常。

參數索引

參數索引是一個十進制整數,用於表明參數在參數列表中的位置。第一個參數由 "1$" 引用,第二個參數由 "2$" 引用,依此類推。

根據位置引用參數的另一種方法是使用 '<' ('<') 標志,這將會重用以前格式說明符的參數。例如,以下兩條語句產生的字符相同:

 
   Calendar c = ...;
   String s1 = String.format("Duke's Birthday: %1$tm %1$te,%1$tY", c);
 
   String s2 = String.format("Duke's Birthday: %1$tm %<te,%<tY", c);
 

詳細信息

這一部分將提供格式化行為規范方面的細節,其中包括條件和異常、受支持的數據類型、本地化以及標志、轉換和數據類型之間的交互。有關格式化概念的概述,請參閱摘要

任何未明確定義為轉換、日期/時間轉換前綴或標志的字符都是非法字符,並且這些字符都被保留,以供未來擴展使用。在格式字符串中使用這樣的字符會導致拋出 UnknownFormatConversionExceptionUnknownFormatFlagsException

如果格式說明符包含帶有無效值或不受支持的其他值的寬度或精度,則將分別拋出 IllegalFormatWidthExceptionIllegalFormatPrecisionException

如果格式說明符包含不適用於對應參數的轉換字符,則將拋出 IllegalFormatConversionException

所有指定異常都可能被 Formatter 的任何 format 方法以及任何 format 的便捷方法拋出,比如 String#format(String,Object...)String.formatjava.io.PrintStream#printf(String,Object...)PrintStream.printf。 String.format} and PrintStream.printf.

由大寫字符(如 'B''H''S''C''X''E''G''A''T')表示的轉換與那些相應的小寫字符表示的轉換相同,根據流行的 Locale 規則將結果轉換成大寫形式除外。結果等同於 String#toUpperCase()的以下調用

 
    out.toUpperCase() 

常規

以下常規轉換可應用於任何參數類型:

'b''b'將生成 "true" 或 "false",由 Boolean#toString(boolean)返回。

如果參數為 null,則結果為 "false"。如果參數是一個 boolean 值或 Boolean,那么結果是由 String.valueOf() 返回的字符串。否則結果為 "true"。

如果給出 '#' 標志,則將拋出 FormatFlagsConversionMismatchException

'B''B''b'的大寫形式。'h''h'生成一個表示對象的哈希碼值的字符串。

如果參數 argnull,則結果為 "null"。否則,結果為調用 Integer.toHexString(arg.hashCode())得到的結果。

如果給出 '#' 標志,則將拋出 FormatFlagsConversionMismatchException

'H''H''h'的大寫形式。's''s'生成一個字符串。

如果參數為 null,則結果為 "null"。如果參數實現了 Formattable,則調用其 formatTo 方法。否則,結果為調用參數的 toString()方法得到的結果。

如果給出 '#' 標志,且參數不是 Formattable,則將拋出 FormatFlagsConversionMismatchException

'S''S''s' 的大寫形式。

以下 標志 應用於常規轉換:

'-''-'將輸出左對齊。根據需要在轉換值結尾處添加空格 (' '),以滿足字段的最小寬度要求。如果沒有提供寬度,則將拋出 MissingFormatWidthException。如果沒有給出此標志,則輸出將是右對齊的。'#''#'要求輸出使用替換形式。此形式的定義通過轉換指定。

寬度 是將向輸出中寫入的最少字符數。如果轉換值的長度小於寬度,則用 '  ' (\u0020') 填充輸出,直到字符總數等於寬度為止。默認情況下,是在左邊進行填充。如果給出 '-'標志,則在右邊進行填充。如果沒有指定寬度,則沒有最小寬度。

精度是將向輸出中寫入的最多字符數。精度的應用要先於寬度,因此,即使寬度大於精度,輸出也將被截取為 precision字符。如果沒有指定精度,則對字符數沒有明確限制。

字符

此轉換可應用於 charCharacter。它還可應用於類型 byteByteshortShortintInteger。當 Character#isValidCodePoint 返回 true 時,此轉換也可應用於 intInteger。如果返回 false,則將拋出 IllegalFormatCodePointException

'c''c'將參數格式化為 Unicode Character Representation 中描述的 Unicode 字符。在該參數表示增補字符的情況下,它可能是多個 16 位 char

如果給出 '#' 標志,則將拋出 FormatFlagsConversionMismatchException

'C''C''c' 的大寫形式。

'-' 標志是為應用常規轉換而定義的。如果給出 '#' 標志,則將拋出 FormatFlagsConversionMismatchException

寬度是為了實現常規轉換而定義的。

精度不適用。如果指定精度,則將拋出 IllegalFormatPrecisionException

數值

數值轉換分為以下幾類:

  1. Byte、Short、Integer 和 Long
  2. BigInteger
  3. Float 和 Double
  4. BigDecimal

將根據以下算法對數值類型進行格式化:

數字本地化算法

在獲得數字的整數部分、小數部分和指數(適用於數據類型)之后,將應用以下轉換:

  1. 將字符串中的每個數字字符 d 都替換為特定於語言環境的數字,該數字是相對於當前語言環境的零數字 z 來計算的;即 d -  '0'  + z
  2. 如果存在小數點分隔符,則用特定於語言環境的小數點分隔符替換。
  3. 如果給出 ',' (',') flag 標志,則插入特定於語言環境的組分隔符,這是通過從最低位到最高位瀏覽字符串的整數部分並不時插入該語言環境組大小定義的分隔符來實現的。
  4. 如果給出 '0' 標志,則在符號字符(如果有的話)之后、第一個非零數字前插入特定於語言環境的零數字,直到字符串長度等於所要求的字段寬度。
  5. 如果該值為負,並且給出了 '(' 標志,那么預先考慮 '(' ('('),並追加一個 ')' (')')。
  6. 如果該值為負(或者為浮點負零),並且沒有給出 '(' 標志,那么預先考慮 '-' ('-')。
  7. 如果給出 '+' 標志,並且該值為正或零(或者為浮點正零),那么將預先考慮 '+' ('+')。

如果該值為 NaN 或正無窮大,則分別輸出文本字符串 "NaN" 或 "Infinity"。如果該值為負無窮大,那么輸出將是 "(Infinity)";否則如果給出 '('標志,那么輸出將是 "-Infinity"。這些值都沒有被本地化。

Byte、Short、Integer 和 Long

以下轉換可應用於 byteByteshortShortintIntegerlongLong

'd''T'將參數格式化為十進制整數。應用本地化算法

如果給出 '0'標志,並且值為負,則在符號后填充零。

如果給出 '#' 標志,則將拋出 FormatFlagsConversionMismatchException

'o''o'將參數格式化為以 8 為基數的整數。不應用本地化。

如果 x 為負,那么結果將是通過將 2n 添加到值中產生的一個無符號值,其中 n 是在適當時候由類 ByteShortIntegerLong 中的靜態 SIZE字段返回的類型中的位數。

如果給出 '#' 標志,則輸出將始終以基數指示符 '0'開始。

如果給出 '0'標志,則使用前導零填充輸出,這些零被填充到以下任意指示符號后面的字段寬度中。

如果給出 '(''+'、'  ' 或 '、' 標志,則將拋出 FormatFlagsConversionMismatchException

'x''x'將參數格式化為以 16 為基數的整數。不應用本地化。

如果 x 為負,那么結果將為把 2n 添加到值中產生的一個無符號值,其中 n 是在適當時候,由類 ByteShortIntegerLong 中的靜態 SIZE字段返回的類型中的位數。

如果給出 '#' 標志,則輸出將始終以基數指示符 '0x'開始。

如果給出 '0'標志,則使用前導零填充輸出,這些零被填充到基數指示符或符號(如果存在)后面的字段寬度中。

如果給出 '(''  ''+''、' 標志,則將拋出 FormatFlagsConversionMismatchException

'X''X''x' 的大寫形式。將表示數字的整個字符串轉換為大寫,其中包括 'x' (如果有的話) 和所有十六進制數字 'a' - 'f' ('a' - 'f')。

如果該轉換是 'o''x''X' 轉換,並且給出了 '#''0' 標志,那么結果將包含基數指示符(對於八進制是 '0',對於十六進制是 '0'"0x")、一定數量的零(基於寬度)和該值。

如果沒有給出 '-'標志,則在符號前填充空格。

以下 標志 應用於數值整數轉換:

'+''+'要求所有正數的輸出都包含一個正號。如果沒有給出此標志,則只有負值包含符號。

如果同時給出了 '+''  ' 標志,則將拋出 IllegalFormatFlagsException

'  '' '對於非負值的輸出,要求包括單個額外空格 (' ')。

如果同時給出了 '+''  ' 標志,則將拋出 IllegalFormatFlagsException

'0''0'要求將前導填充到輸出中,這些零被填充到以下任意符號或基數指示符之后,以達到最小字段寬度,轉換 NaN 或無窮大時除外。如果沒有提供寬度,則將拋出 MissingFormatWidthException

如果同時給出 '-''0' 標志,則將拋出 IllegalFormatFlagsException

','','要求輸出包括在本地化算法的“群”一節中描述的特定於語言環境的組分隔符'(''('要求輸出預先考慮 '(' ('('),並將 ')' (')') 追加到負值中。

如果沒有給出 標志 ,則默認格式設置如下:

  • width中的輸出是右對齊的
  • 負數以 '-' ('-') 開始
  • 正數和零不包括符號或額外的前導空格
  • 不包括組分隔符

The 寬度 是將向輸出中寫入的最少字符數。這包括所有符號、數字、組分隔符、基數指示符和圓括號。如果轉換值的長度小於寬度,則用空格('\u0020') 填充輸出,直到字符總數等於寬度。默認情況下,在左邊進行填補。如果給出 '-'標志,則在右邊進行填補。如果沒有指定寬度,則沒有最小寬度。

精度不適用。如果指定精度,則將拋出 IllegalFormatPrecisionException

BigInteger

以下轉換可應用於 java.math.BigInteger

'd''T'要求將輸出格式化為十進制整數。應用本地化算法

如果給出 '#' 標志,則將拋出 FormatFlagsConversionMismatchException

'o''o'要求將輸出格式化為以 8 為基數的整數。不應用本地化。

如果 x 為負,那么結果將是以 '-' ('\u002d') 開始的有符號值。允許對這種類型使用有符號輸出,因為它不同於基本類型,在沒有假定顯式數據類型大小的情況下,不可能創建無符號的等效值。

如果 x 為正數或零,且給出了 '+' 標志,那么結果是以 '+' ('+') 開始的。

如果給出 '#' 標志,那么輸出將始終以 '0'前綴開始。

如果給出 '0'標志,那么將使用前導零填充輸出,這些零被填充到指示符后的字段寬度中。

如果給出 ',' 標志,則將拋出 FormatFlagsConversionMismatchException

'x''x'要求將輸出格式化為以 16 為基數的整數。不應用本地化。

如果 x 為負,那么結果是以 '-' ('_apos;) 開始的有符號值。此類型允許使用有符號輸出,因為與基本類型不同,如果不假定明確的數據類型大小,則不可能創建無符號的等效數。

如果 x 為正數或零,且給出了 '+' 標志,那么結果以 '+' ('+') 開始。

如果給出 '#' 標志,那么輸出將始終以基數指示符 '0x'開始。

如果給出 '0'標志,那么將使用前導零填充輸出,這些零被填充到基數指示符或符號(如果存在)后面的字段寬度中。

如果給出 ',' 標志,則將拋出 FormatFlagsConversionMismatchException

'X''X''x' 的大寫形式。將表示數字的整個字符串轉換為大寫,其中包括 'x'(如果有的話)和所有十六進制數字 'a' - 'f' ('a' - 'f')。

如果該轉換是 'o''x''X',並且給出了 '#''0' 標志,那么結果將包含基數指示符(對於八進制是 '0',對於十六進制是 '0'"0x")、一定數量的零(基於寬度)和該值。

如果給出 '0'標志,並且值為負,則在符號后填充零。

如果沒有給出 '-'標志,則在符號前填充空格。

應用為 Byte、Short、Integer 和 Long 定義的所有標志。沒有給出標志時的默認行為與 Byte、Short、Integer 和 Long 的行為相同。

寬度的規范與為 Byte、Short、Integer 和 Long 定義的規范相同。

精度不適用。如果指定精度,則將拋出 IllegalFormatPrecisionException

Float 和 Double

以下轉換可應用於 floatFloatdoubleDouble

'e''e'要求使用科學記數法來格式化輸出。應用本地化算法

數值 m的格式取決它的值。

如果 m是 NaN 或無窮大,則分別輸出文本字符串 "NaN" 或 "Infinity"。這些值都沒有被本地化。

如果 m 是正零或負零,則指數將是 "+00"

否則,結果是表示變量的符號和大小(絕對值)的字符串。符號的格式在本地化算法中已經描述。數值 m的格式取決它的值。

n 成為滿足 10n <= m < 10n+1 的唯一整數;讓 a 成為 m 和 10n 的精確算術商數值,且滿足 1 <= a < 10。然后將該數值解釋為 a 的整數部分,因為是一個小數位數,所以后面跟着小數點分隔符,再后面是表示 a 的小數部分的小數位數,后跟指數符號 'e' ('e'),這之后是指數符號,后跟十進制整數形式表示的 n,它由方法 int)產生,並用零填充,使其至少包括兩個位數。

在結果中,ma 的小數部分的位數等於精度。如果沒有指定精度,則默認值為 6。如果精度小於將出現在分別由 Float#toString(float)Double#toString(double) 返回的字符串中的小數點之后的位數,則使用四舍五入算法對該值進行舍入運算。否則,可能通過追加零來達到所需精度。要獲得該值的規范表示形式,請在適當時候使用 Float#toString(float)Double#toString(double)

如果給出 ',' 標志,則將拋出 FormatFlagsConversionMismatchException

'E''E''e' 的大寫形式。指數符號將是 'E' ('E')。'g''g'要求將輸出格式化為下面描述的常規科學記數形式。應用本地化算法

在對精度進行舍入運算后,所得數值 m的格式取決於它的值。

如果 m 大於等於 10-4 但小於 10精度,則以十進制形式表示它。

如果 m 小於 10-4 或者大於等於 10精度,則以計算機科學記數法表示它。

m 中的總有效位數等於其精度。如果沒有指定精度,則其默認值為 6。如果精度為 0,則該值將為 1

如果給出 '#' 標志,則將拋出 FormatFlagsConversionMismatchException

'G''G''g'的大寫形式。'f''f'要求使用十進制形式來格式化輸出。使用本地化算法

結果是表示參數的符號和大小(絕對值)的字符串。符號的格式在本地化算法中已經描述。數值 m的格式取決它的值。

如果 m是 NaN 或無窮大,則將分別輸出文本字符串 "NaN" 或 "Infinity"。這些值都沒有被本地化。

將數值格式化為 m 的整數部分(不帶前導零),后跟小數點分隔符,再后面是表示 m的小數部分的一個或多個十進制數字。

在結果中,ma 的小數部分的位數等於精度。如果沒有指定精度,則默認值為 6。如果該精度小於將要出現在分別由 Float#toString(float)Double#toString(double) 返回的字符串中的小數點之后的位數,則使用四舍五入算法對該值進行舍入運算。否則,可能通過追加零來達到所需精度。要獲得該值的規范表示形式,請在適當時候使用 Float#toString(float)Double#toString(double)

'a''a'要求將輸出格式化為十六進制指數形式。不應用本地化。

結果是表示參數 x的符號和大小(絕對值)的字符串。

如果 x 為負值或負零值,那么結果將以 '-' ('-') 開始。

如果 x 為正值或正零值,且給出了 '+' 標志,那么結果將以 '+' ('+') 開始。

數值 m的格式取決它的值。

  • 如果該值是 NaN 或無窮大,則將分別輸出文本字符串 "NaN" 或 "Infinity"。
  • 如果 m 等於零,則用字符串 "0x0.0p0"表示它。
  • 如果 m 是具有標准化表現形式的 double 值,則用子字符串來表示有效位數和指數字段。有效位數是用字符串 "0x1." 表示的,后跟該有效位數小數部分的十六進制表示形式。指數用 'p' ('p') 表示,后跟無偏指數的十進制字符串,該值是對指數值調用 Integer.toString所產生的。
  • 如果 m 是具有低正常表現形式的 double 值,則用字符 "0x0." 表示有效位數,后跟該有效位數小數部分的十六進制表示。用 'p-1022' 表示指數。注意,在低正常有效位數中,至少必須有一個非零數字。

如果給出 '('',' 標志,則將拋出 FormatFlagsConversionMismatchException

'A''A''a' 的大寫形式。表示數字的整個字符串將被轉換為大寫形式,其中包括 'x' ('x') 和 'p' ('p' 以及所有的十六進制數字 'a' - 'f' ('a' - 'f')。

應用為 Byte、Short、Integer 和 Long 定義的所有標志

如果給出 '#'標志,則將始終存在小數點分隔符。

如果沒有給出 標志 則默認格式設置如下:

  • width中的輸出是右對齊的。
  • 負數以 '-'開頭
  • 正數和正零不包括符號或額外的前導空格
  • 不包括組分隔符
  • 小數點分隔符只在后面有數字時才出現

The 寬度 是將向輸出中寫入的最少字符數。這包括可應用的所有符號、數字、組分隔符、小數點分隔符、指數符號、基數指示符、圓括號和表示無窮大和 NaN 的字符串。如果轉換值的長度小於寬度,則用空格('\u0020') 填充輸出,直到字符總數等於寬度。默認情況下,在左邊進行填充。如果給出 '-'標志,則在右邊進行填充。如果沒有指定寬度,則沒有最小寬度。

如果 轉換 是 'e''E''f',則精度是小數點分隔符后的位數。如果沒有指定精度,則假定精度為 6

如果轉換是 'g''G' 轉換,那么精度就是舍入運算后所得數值的總有效位數。如果沒有指定精度,則默認值為 6。如果精度為 0,則該值將為 1

如果轉換是 'a''A' 轉換,則精度是小數點分隔符后十六進制數字的位數。如果沒有提供精度,則將輸出 Double#toHexString(double)返回的所有數字。

BigDecimal

以下轉換可應用於 BigDecimal

'e''e'要求使用計算機科學記數法對輸出進行格式化。應用本地化算法

數值 m的格式取決於它的值。

如果 m 為正零或負零,則指數將為 "+00"

否則,結果是表示參數的符號和大小(絕對值)的字符串。符號的格式在本地化算法中已經描述。數值 m的格式取決於它的值。

n 成為滿足 10n <= m < 10n+1 的唯一整數;讓 a 成為 m 和 10n 的精確算術商數值,且滿足 1 <= a < 10。然后將該數值解釋為 a 的整數部分,因為是一個小數位數,所以后面跟着小數點分隔符,再后面是表示 a 的小數部分的小數位數,后跟指數符號 'e' ('e'),這之后是指數符號,后跟十進制整數形式表示的 n,它由方法 int)產生,並用零填充,使其至少包括兩個位數。

在結果中,ma 的小數部分的位數等於精度。如果沒有指定精度,則默認值為 6。如果精度小於將出現在分別由 Float#toString(float)Double#toString(double) 返回的字符串中的小數點之后的位數,則使用四舍五入算法對該值進行舍入運算。否則,可能通過追加零來達到所需精度。要獲得該值的規范表示形式,請使用 BigDecimal#toString()

如果給出 ',' 標志,則將拋出 FormatFlagsConversionMismatchException

'E''E''e' 的大寫形式。指數符號將是 'E' ('E')。'g''g'要求將輸出格式化為下面描述的常規科學記數形式。應用本地化算法

在對精度進行舍入運算后,所得數值 m的格式取決於它的值。

如果 m 大於等於 10-4 但小於 10精度,則以十進制形式表示它。

如果 m 小於 10-4 或者大於等於 10精度,則以計算機科學記數法表示它。

m 中的總的有效位數等於精度。如果沒有指定精度,則默認值為 6。如果精度為 0,則該值將為 1

如果給出 '#' 標志,則將拋出 FormatFlagsConversionMismatchException

'G''G''g'的大寫形式。'f''f'要求使用十進制形式來格式化輸出。應用本地化算法

結果是表示參數的符號和大小(絕對值)的字符串。符號的格式在本地化算法中已經描述。數值 m的格式取決於它的值。

將該數值格式化為 m 的整數部分(不帶前導零),后跟小數點分隔符,再后面是表示 m的小數部分的一個或多個十進制數字。

在結果中,ma 的小數部分的位數等於精度。如果沒有指定精度,則默認值為 6。如果精度小於將出現在分別由 Float#toString(float)Double#toString(double) 返回的字符串中的小數點之后的位數,則使用四舍五入算法對該值進行舍入運算。否則,可能通過追加零來達到所需精度。要獲得該值的規范表示形式,請使用 BigDecimal#toString()

應用為 Byte、Short、Integer 和 Long 定義的所有標志

如果給出 '#'標志,則將始終存在小數點分隔符。

沒有給出標志時的默認行為與 Float 和 Double 的行為相同。

寬度精度的規范與為 Float 和 Double 定義的規范相同。

日期/時間

此轉換可應用於 longLongCalendarDate

't''t'日期和時間轉換字符的前綴。'T''T''t' 的大寫形式。

以下日期和時間轉換字符后綴是為 't''T' 轉換定義的。這些類型類似於但不完全等同於 GNU date 和 POSIX strftime(3c) 定義的那些類型。提供其他轉換類型是為了訪問特定於 Java 的功能(例如,'L'用於秒中的毫秒)。

以下轉換字符用來格式化時間:

'H''H'24 小時制的小時,被格式化為必要時帶前導零的兩位數,即 00 - 2300對應午夜。'I''I'12 小時制的小時,被格式化為必要時帶前導零的兩位數,即 01 - 1201對應於 1 點鍾(上午或下午)。'k''k'24 小時制的小時,即 0 - 230對應於午夜。'l''l'12 小時制的小時,即 1 - 121對應於上午或下午的一點鍾。'M''M'小時中的分鍾,被格式化為必要時帶前導零的兩位數,即 00 - 59'S''S'分鍾中的秒,被格式化為必要時帶前導零的兩位數,即 00 - 60("60" 是支持閏秒所需的一個特殊值)。'L''L'秒中的毫秒,被格式化為必要時帶前導零的三位數,即 000 - 999'N''N'秒中的毫微秒,被格式化為必要時帶前導零的九位數,即 000000000 - 999999999。此值的精度受底層操作系統或硬件解析的限制。'p''p'特定於語言環境的上午或下午標記以小寫形式表示,例如 "am" 或 "pm"。使用轉換前綴 'T' 可以強行將此輸出轉換為大寫形式。(注意,'p' 產生的輸出是小寫的。而 GNU date 和 POSIX strftime(3c)產生的輸出是大寫的。)'z''z'相對於 GMT 的 RFC 822 格式的數字時區偏移量,例如 -0800'Z''Z'表示時區的縮寫形式的字符串。's''s'自協調世界時 (UTC) 1970 年 1 月 1 日 00:00:00 至現在所經過的秒數,也就是 Long.MIN_VALUE/1000Long.MAX_VALUE/1000之間的差值。'Q''O'自協調世界時 (UTC) 1970 年 1 月 1 日 00:00:00 至現在所經過的毫秒數,即 Long.MIN_VALUELong.MAX_VALUE 之間的差值。此值的精度受底層操作系統或硬件解析的限制。

以下轉換字符用來格式化日期:

'B''B'特定於語言環境的完整月份名稱,例如 "January""February"'b''b'特定於語言環境的月份簡稱,例如 "Jan""Feb"'h''h''b'相同。'A''A'特定於語言環境的星期幾的全稱,例如 "Sunday""Monday"'a''a'特定於語言環境的星期幾的簡稱,例如 "Sun""Mon"'C''C'除以 100 的四位數表示的年份,被格式化為必要時帶前導零的兩位數,即 00 - 99'Y''Y'年份,被格式化為必要時帶前導零的四位數(至少),例如 0092 等於格里高利歷的 92CE。'y''y'年份的最后兩位數,被格式化為必要時帶前導零的兩位數,即 00 - 99'j''j'一年中的天數,被格式化為必要時帶前導零的三位數,例如,對於格里高利歷是 001 - 366001對應於一年中的第一天。'm''m'月份,被格式化為必要時帶前導零的兩位數,即 01 - 13,其中 "01" 是一年的第一個月,("13" 是支持陰歷所需的一個特殊值)。'd''d'一個月中的天數,被格式化為必要時帶前導零的兩位數,即 01 - 31,其中 "01" 是一個月的第一天。'e''e'一個月中的天數,被格式化為兩位數,即 1 - 31,其中 "1" 是一個月中的第一天。

以下轉換字符用於格式化常見的日期/時間組合。

'R''R'24 小時制的時間,被格式化為 "%tH:%tM"'T''T'24 小時制的時間,被格式化為 "%tH:%tM:%tS"'r''r'12 小時制的時間,被格式化為 "%tI:%tM:%tS %Tp"。上午或下午標記 ('%Tp') 的位置可能與地區有關。'D''D'日期,被格式化為 "%tm/%td/%ty"'F''F'ISO 8601 格式的完整日期,被格式化為 "%tY-%tm-%td"'c''c'日期和時間,被格式化為 "%ta %tb %td %tT %tZ %tY",例如 "Sun Jul 20 16:17:00 EDT 1969"

應用為常規轉換而定義的 '-' 標志。如果給出 '#' 標志,則將拋出 FormatFlagsConversionMismatchException

寬度 是將向輸出中寫入的最少字符數。如果轉換值的長度小於 width,則用空格(' ') 來填充輸出,直到總字符數等於寬度。默認情況下,在左邊進行填充。如果給出 '-'標志,則在右邊進行填充。如果沒有指定寬度,則沒有最小寬度。

精度不適用。如果指定了精度,則將拋出 IllegalFormatPrecisionException

百分比

該轉換不對應於任何參數。

'%'結果是一個字面值 '%' ('%')

寬度 是將向輸出中寫入的最少字符數,包括 '%'。如果轉換值的長度小於 width,則用空格 (' ') 來填充輸出,直到總字符數等於寬度。在左邊進行填充。如果沒有指定寬度,則只輸出 '%'

應用為常規轉換而定義的 '-' 標志。如果提供其他任何標志,則將拋出 FormatFlagsConversionMismatchException

精度不適用。如果指定精度,則將拋出 IllegalFormatPrecisionException

行分隔符

該轉換不對應於任何參數。

'n'System.getProperty("line.separator") 返回的特定於平台的行分隔符。

標志、寬度和精度都不可用。如果提供這三者,則會分別拋出 IllegalFormatFlagsExceptionIllegalFormatWidthExceptionIllegalFormatPrecisionException

參數索引

格式說明符可以通過三種方式引用參數:

  • 顯式索引 是在格式說明符中包含參數索引時使用。參數索引是一個十進制整數,用於指示參數在參數列表中的位置。第一個參數由 "1$" 引用,第二個參數由 "2$" 引用,依此類推。可以多次引用任何一個參數。

    例如:

     
       formatter.format("%4$s %3$s %2$s %1$s %4$s %3$s %2$s %1$s",
                        "a", "b", "c", "d")
       // -> "d c b a d c b a"
     

     

  • 相對索引 是在格式說明符中包含 '<' ('<') 標志時使用,該標志將導致重用以前格式說明符的參數。如果不存在以前的參數,則拋出 MissingFormatArgumentException
     
        formatter.format("%s %s %<s %<s", "a", "b", "c", "d")
       // -> "b a a b"
        // "c" and "d" are ignored because they are not referenced
     
  • 普通索引 在格式說明符中既不包含參數索引也不包含 '<'標志時使用。每個使用普通索引的格式說明符都分配了一個連續隱式索引,分配在獨立於顯式索引或相對索引使用的參數列表中。
     
       formatter.format("%s %s %s %s", "a", "b", "c", "d")
       // -> "a b c d"
     

可能有一個使用所有索引形式的格式字符串,例如:

 
   formatter.format("%2$s %s %<s %s", "a", "b", "c", "d")
   // -> "b a a b"
   // "c" and "d" are ignored because they are not referenced
 

參數的最大數量受到 Java Machine Specification 定義的 Java 數組 的最大維數的限制。如果參數索引與可用參數不對應,則拋出 MissingFormatArgumentException

如果參數多於格式說明符,則忽略額外的參數。

除非另行指定,否則向此類中的任何方法或構造方法傳遞 null 參數都將拋出 NullPointerException

version 1.26, 06/28/06
since 1.5

 

Constructors
public Formatter()
構造一個新 formatter。

格式化輸出的目標文件是 StringBuilder,可以通過調用 out() 來獲取它,還可以調用 toString() 將其當前內容轉換為一個字符串。對於 Java 虛擬機的此實例,所使用的語言環境是默認語言環境

 

public Formatter(Appendable a)
構造一個帶指定目標文件的新 formatter。

對於 Java 虛擬機的此實例,所使用的語言環境是默認語言環境

a 格式化輸出的 Destination。如果 anull,則創建一個 StringBuilder

 

public Formatter(Locale l)
構造一個帶指定語言環境的新 formatter。

格式化輸出的目標文件是 StringBuilder,可以通過調用 out() 來獲取它,還可以調用 toString()將其內容轉換為一個字符串。

l 格式化過程中應用的 locale。如果 lnull,則不應用本地化。

 

public Formatter(Appendable a, Locale l)
構造一個帶指定目標文件和語言環境的新 formatter。
a 格式化輸出的 Destination。如果 anull,則創建一個 StringBuilder
l 格式化過程中應用的 locale。如果 lnull,則不應用本地化。
 
public Formatter(String fileName) throws FileNotFoundException
構造一個帶指定文件名的新 formatter。

對於 Java 虛擬機的此實例,所使用的字符集是默認字符集

對於 Java 虛擬機的此實例,所使用的語言環境是默認語言環境

fileName 用作此 formatter 的目標文件的文件名稱。如果存在該文件,則將其大小截取為零;否則創建一個新文件。將輸出寫入文件中,並對其進行緩沖處理。
Throws SecurityException: 如果存在安全管理器,並且 checkWrite(fileName) 拒絕對文件進行寫入訪問
Throws FileNotFoundException: 如果給定的文件名稱不表示現有的可寫常規文件,並且無法創建該名稱的新常規文件,或者在打開或創建文件時發生其他一些錯誤

 

public Formatter(String fileName, String csn) throws FileNotFoundException, UnsupportedEncodingException
構造一個帶指定文件名和字符集的新 formatter。

對於 Java 虛擬機的此實例,所使用的語言環境是默認語言環境

fileName 用作此 formatter 的目標文件的文件名稱。如果存在該文件,則將其大小截取為零;否則創建一個新文件。將輸出寫入文件中,並對其進行緩沖處理。
csn 受支持的字符集的名稱
Throws FileNotFoundException: 如果給定的文件名稱不表示現有的可寫常規文件,並且無法創建該名稱的新常規文件,或者在打開或創建文件時發生其他一些錯誤
Throws SecurityException: 如果存在安全管理器,並且 checkWrite(fileName) 拒絕對文件進行寫入訪問
Throws UnsupportedEncodingException: 如果不支持指定的字符集

 

public Formatter(String fileName, String csn, Locale l) throws FileNotFoundException, UnsupportedEncodingException
構造一個帶指定文件名、字符集和語言環境的新 formatter。
fileName 用作此 formatter 的目標文件的文件名稱。如果存在該文件,則將其大小截取為零;否則創建一個新文件。將輸出寫入文件中,並對其進行緩沖處理。
csn 受支持的字符集的名稱
l 格式化過程中應用的 locale。如果 lnull,則不應用本地化。
Throws FileNotFoundException: 如果給定的文件名稱不表示現有的可寫常規文件,並且無法創建該名稱的新常規文件,或者在打開或創建文件時發生其他一些錯誤
Throws SecurityException: 如果存在安全管理器,並且 checkWrite(fileName) 拒絕對文件進行寫入訪問
Throws UnsupportedEncodingException: 如果不支持指定的字符集
 
public Formatter(File file) throws FileNotFoundException
構造一個帶指定文件的新 formatter。

對於 Java 虛擬機的此實例,所使用的字符集是默認字符集

對於 Java 虛擬機的此實例,所使用的語言環境是默認語言環境

file 作為此 formatter 的目標文件使用的文件。如果存在該文件,則將其大小截取為零;否則,創建一個新文件。將輸出寫入文件中,並對其進行緩沖處理。
Throws SecurityException: 如果存在安全管理器,並且 checkWrite(file.getPath()) 拒絕對文件進行寫入訪問
Throws FileNotFoundException: 如果給定的文件對象不表示現有的可寫常規文件,並且無法創建該名稱的新常規文件,或者在打開或創建文件時發生其他一些錯誤

 

public Formatter(File file, String csn) throws FileNotFoundException, UnsupportedEncodingException
構造一個帶指定文件和字符集的新 formatter。

對於 Java 虛擬機的此實例,所使用的語言環境是默認語言環境

file 作為此 formatter 的目標文件使用的文件。如果存在該文件,則將其大小截取為零;否則,創建一個新文件。將輸出寫入文件中,並對其進行緩沖處理。
csn 受支持的字符集的名稱
Throws FileNotFoundException: 如果給定的文件對象不表示現有的可寫常規文件,並且無法創建該名稱的新常規文件,或者在打開或創建文件時發生其他一些錯誤
Throws SecurityException: 如果存在安全管理器,並且 checkWrite(file.getPath()) 拒絕對文件進行寫入訪問
Throws UnsupportedEncodingException: 如果不支持指定的字符集

 

public Formatter(File file, String csn, Locale l) throws FileNotFoundException, UnsupportedEncodingException
構造一個帶指定文件、字符集和語言環境的新 formatter。
file 作為此 formatter 的目標文件使用的文件。如果存在該文件,則將其大小截取為零;否則,創建一個新文件。將輸出寫入文件中,並對其進行緩沖處理。
csn 受支持的字符集的名稱
l 格式化過程中應用的 locale。如果 lnull,則不應用本地化。
Throws FileNotFoundException: 如果給定的文件對象不表示現有的可寫常規文件,並且無法創建該名稱的新常規文件,或者在打開或創建文件時發生其他一些錯誤
Throws SecurityException: 如果存在安全管理器,並且 checkWrite(file.getPath()) 拒絕對文件進行寫入訪問
Throws UnsupportedEncodingException: 如果不支持指定的字符集
 
public Formatter(PrintStream ps)
構造一個帶指定輸出流的新 formatter。

對於 Java 虛擬機的此實例,所使用的語言環境是默認語言環境

將字符寫入給定的 PrintStream對象,並使用該對象的字符集對其進行編碼。

ps 作為此 formatter 的目標文件使用的流。

 

public Formatter(OutputStream os)
構造一個帶指定輸出流的新 formatter。

對於 Java 虛擬機的此實例,所使用的字符集是默認字符集

對於 Java 虛擬機的此實例,所使用的語言環境是默認語言環境

os 作為此 formatter 的目標文件使用的流。將對輸出進行緩沖。

 

public Formatter(OutputStream os, String csn) throws UnsupportedEncodingException
構造一個帶指定輸出流和字符集的新 formatter。

對於 Java 虛擬機的此實例,所使用的語言環境是默認語言環境

os 作為此 formatter 的目標文件使用的流。將對輸出進行緩沖。
csn 受支持的字符集的名稱
Throws UnsupportedEncodingException: 如果不支持指定的字符集

 

public Formatter(OutputStream os, String csn, Locale l) throws UnsupportedEncodingException
構造一個帶指定輸出流、字符集和語言環境的新 formatter。
os 作為此 formatter 的目標文件使用的流。將對輸出進行緩沖。
csn 受支持的字符集的名稱
l 格式化過程中應用的 locale。如果 lnull,則不應用本地化。
Throws UnsupportedEncodingException: 如果不支持指定的字符集
 

 

Methods
public void close()
關閉此 formatter。如果目標文件實現 java.io.Closeable 接口,則調用其 close方法。

關閉 formatter 允許釋放它可能保持(比如打開文件)的資源。如果已經關閉 formatter,則調用此方法無效。

如果試圖在此 formatter 已經關閉之后調用其中除 #ioException() 之外的任何方法,那么都將導致 FormatterClosedException

 

public void flush()
刷新此 formatter。如果目標文件實現 java.io.Flushable 接口,則調用其 flush方法。

刷新 formatter 會使目標文件中的所有緩沖輸出都寫入底層流中。

Throws FormatterClosedException: 如果已經通過調用 #close() 方法關閉此 formatter

 

public Formatter format(String format, Object[] args)
使用指定格式字符串和參數將一個格式化字符串寫入此對象的目標文件中。使用的語言環境是構造此 formatter 期間定義的語言環境。
format 格式字符串的語法中描述的格式字符串。
args 格式字符串中的格式說明符引用的參數。如果參數多於格式說明符,則忽略額外的參數。參數的最大數量受到 Java 虛擬機規范定義的 Java 數組最大維數的限制。
Throws IllegalFormatException: 如果格式字符串包含非法語法、與給定參數不兼容的格式說明符、對給定格式字符串而言不夠充足的參數或其他非法條件。有關所有可能的格式錯誤的規范,請參閱 formatter 類規范的詳細信息部分。
Throws FormatterClosedException: 如果已經通過調用 #close() 方法關閉此 formatter
return 此 formatter
 
public Formatter format(Locale l, String format, Object[] args)
使用指定的語言環境、格式字符串和參數,將一個格式化字符串寫入此對象的目標文件中。
l 格式化過程中應用的語言環境。如果 lnull,則不應用本地化。這不會改變構造期間設置的對象的語言環境。
format 格式字符串的語法中描述的格式字符串
args 格式字符串中的格式說明符引用的參數。如果參數多於格式說明符,則忽略額外的參數。參數的最大數量受到 Java Virtual Machine Specification 定義的 Java 數組的最大維數的限制
Throws IllegalFormatException: 如果格式字符串包含非法語法、與給定參數不兼容的格式說明符、對給定格式字符串而言不夠充足的參數或其他非法條件。有關所有可能的格式錯誤的規范,請參閱 formatter 類規范的詳細信息部分。
Throws FormatterClosedException: 如果已經通過調用 #close() 方法關閉此 formatter
return 此 formatter
 
public IOException ioException()
返回由此 formatter 的 Appendable 方法上次拋出的 IOException異常。

如果目標文件的 append() 方法從未拋出 IOException,則此方法將始終返回 null

return 如果不存在這樣的異常,則返回由 Appendable 或 null 上次拋出的異常。

 

public Locale locale()
返回構造此 formatter 時設置的語言環境。

此對象的帶語言環境參數的格式方法不會更改該值。

return 如果沒有應用本地化,則返回 null;否則返回一個語言環境
Throws FormatterClosedException: 如果已經通過調用 #close() 方法關閉此 formatter

 

public Appendable out()
返回輸出的目標文件。
return 輸出的目標文件
Throws FormatterClosedException: 如果已經通過調用 #close() 方法關閉此 formatter
 
public String toString()
返回對輸出的目標文件調用 toString() 的結果。例如,以下代碼將文本格式化到 StringBuilder中,然后獲取得到的字符串:
 
   Formatter f = new Formatter();
   f.format("Last reboot at %tc", lastRebootDate);
   String s = f.toString();
   // -> s == "Last reboot at Sat Jan 01 00:00:00 PST 2000"
 

調用此方法的方式與調用 out().toString() 的方式完全相同。

 
     out().toString() 

根據針對 AppendabletoString 的規范,返回的字符串可能否包含(也可能不包含)寫入目標文件的字符。例如,緩沖器通常在 toString()中返回其內容,而流不能這樣做,因為數據已被丟棄。

return 對輸出目標文件調用 toString() 的結果
Throws FormatterClosedException: 如果已經通過調用 #close() 方法關閉此 formatter

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM