java 學習之三 Formatter的使用,以及文件擴展名的歸類

實現文件名的格式化

      今天在項目上遇到一個問題,關於標準輸出文件名,

現在講解決方案記錄一下:
                tmp = getString(R.string.bt_sm_2_2,  mTransInfo.mFileType  ,  Formatter.formatFileSize(this,  mTransInfo.mTotalBytes));
                mLine3View.setText(tmp);
通過Formatter.formatFileSize() 這個方法可以實現直接講字符串格式化,如(14.94KB
這裏的filetype 通過
<span style="white-space:pre">	</span>int dotIndex = info.mFileName.lastIndexOf(".");
        if (dotIndex != -1) {
          <span style="white-space:pre">	</span>String extension = info.mFileName.substring(dotIndex + 1).toLowerCase();
                MimeTypeMap map = MimeTypeMap.getSingleton();
                String extType = map.getMimeTypeFromExtension(extension);
                if (extType != null && !extType.isEmpty()) {
                	info.mFileType = extType;
                }
          }
這裏通過Mime這個方法可以得到文件的類型,比如是png ,gif,jpg 等格式的文件會被判定爲圖片輸出  “image/png”



Formatter

簡介

         java中的Formatter類位於java.util.Formatter中,所以需要用到的時候只要import進來就可以用了。注意,請選擇1.5及以上版本的編譯器,否則會出現“The method format(String, Object[]) in the type Formatter is not applicable for the arguments (String, char)”這個錯誤。

使用舉例

創建一個Formatter類,需要向構造函數傳遞你最終想要把結果輸出的位置。例如:System.out,或者是File等等。
[java] view plain copy
  1. import java.util.*;  
  2.   
  3. public class Conversion {  
  4.   public static void main(String[] args) {  
  5.       //new Formatter(你想要字符串格式化輸出的位置,可以使System.out,可以使另外一個String,也可以使一個文件等)  
  6.       Formatter formatterOut = new Formatter(System.out);  
  7.       formatterOut.format("%s""I am a formatter test");  
  8.   }  
  9. }  
  10. //輸出結果:I am a formatter test  
Format String的格式如下:
[java] view plain copy
  1. %[argument_index$][flags][width][.precision]conversion  
字段 說明
argument_index 需要將參數列表中第幾個參數進行格式化
flags
一些特殊的格式,比如‘-’代表向左對齊
width
輸出的最小的寬度,適用於所有的參數類型
[.precision]
參數爲String,則表示打印String輸出字符的最大數量;參數爲float,則表示小數點最大位數。不使用於int
conversion
接受的參數類型,如s代表後面接String類型的參數;d代表接int型的參數

下面,我們舉一些例子來說明上面表格的意思吧,有例子就很清楚了。
[java] view plain copy
  1. import java.util.*;  
  2.   
  3. public class Receipt {  
  4.   private double total = 0;  
  5.   private Formatter f = new Formatter(System.out);  
  6.   public void printTitle() {  
  7.     Calendar c = new GregorianCalendar();  
  8.     //參數說明:  
  9.     //"%1$" 2爲argument_index,說明這個格式作用於參數列表中第1個參數c;  
  10.     //"-" 爲flag,表示向左對齊;  
  11.     //"15"爲width,表示寬度最少爲15;  
  12.     //"tm"爲convention,表示輸出日期中的month; "ty",表示輸出日期中的year, "te",表示輸出日期中的day.  
  13.     f.format("Birthday  %1$-15tm %1$te,%1$tY\n", c);  
  14.     f.format("%-15s %5s %10s\n""Item""Qty""Price");  
  15.     f.format("%-15s %5s %10s\n""----""---""-----");  
  16.   }  
  17.   public void print(String name, int qty, double price) {  
  18.     f.format("%-15.15s %5d %10.2f\n", name, qty, price);  
  19.     total += price;  
  20.   }  
  21.   public void printTotal() {  
  22.     f.format("%-15s %5s %10.2f\n""Tax""", total*0.06);  
  23.     f.format("%-15s %5s %10s\n""""""-----");  
  24.     f.format("%-15s %5s %10.2f\n""Total""",  
  25.       total * 1.06);  
  26.     System.out.println("我是來打醬油的,爲了說明argument_index和precision");  
  27.     //參數說明:  
  28.     //"%2$" 2爲argument_index,說明這個格式作用於參數列表中第二個參數”456“;  
  29.     //"-" 爲flag,表示向左對齊;  
  30.     //"5"爲width,表示寬度最少爲5;  
  31.     //".2"爲precision,作用於String參數,表示等下最多輸出String參數中的2位;  
  32.     //"s"爲convention,表示參數列表中只接受String類型的參數  
  33.     f.format("%2$-5.2s %1$2s""123""456");   
  34.   }  
  35.   public static void main(String[] args) {  
  36.     Receipt receipt = new Receipt();  
  37.     receipt.printTitle();  
  38.     receipt.print("Lao gan ma"44.25);  
  39.     receipt.print("gua zi"35.1);  
  40.     receipt.print("pi jiu he zha ji"114.29);  
  41.     receipt.printTotal();  
  42.   }  
  43. }  

程序輸出結果
[java] view plain copy
  1. Birthday  12              4,2014  
  2. Item              Qty      Price  
  3. ----              ---      -----  
  4. Lao gan ma          4       4.25  
  5. gua zi              3       5.10  
  6. pi jiu he zha j     1      14.29  
  7. Tax                         1.42  
  8.                            -----  
  9. Total                      25.06  
  10. 我是來打醬油的,爲了說明argument_index和precision  

3. convention詳細說明   ( 這個和C語言裏面的標準輸出類似)

'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' 日期/時間 日期和時間轉換字符的前綴。參考下面內容。
'%' 百分比 結果爲字面值 '%' ('\u0025')
'n' 行分隔符 結果爲特定於平臺的行分隔符

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

日期和時間

以下日期和時間轉換的後綴字符是爲 't' 和 'T' 轉換定義的。這些類型相似於但不完全等同於那些由 GNUdate 和 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 的FRC 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' 格式的完整日期,被格式化爲"%tY-%tm-%td"
'c' 日期和時間,被格式化爲 "%ta %tb %td %tT %tZ %tY",例如"Sun Jul 20 16:17:00 EDT 1969"

2.flag詳細說明

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

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

1 取決於 定義。

2 只適用於 'd' 轉換。

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

4 對 BigInteger 應用 'd''o''x' 和 'X' 轉換時,或者對byte 及 Byteshort 及Shortint 及Integerlong 及Long 分別應用 'd' 轉換時適用。

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

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章