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 表示该标志受指示参数类型支持。

标志常规字符整数浮点日期/时间说明
'-'yyyyy结果将是左对齐的。
'#'y1-y3y-结果应该使用依赖于转换类型的替换形式
'+'--y4y-结果总是包括一个符号
' '--y4y-对于正值,结果中将包括一个前导空格
'0'--yy-结果将用零来填充
','--y2y5-结果将包括特定于语言环境的组分隔糊
'('--y4y5-结果将是用圆括号括起来的负数

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' 转换。

任何未显式定义为标志的字符都是非法字符,并且都被保留,以供扩展使用。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值