日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

android Formatter 的使用

發(fā)布時間:2024/4/15 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android Formatter 的使用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
今天,簡單講講android里的關(guān)于Formatter 的使用。 


這幾天換租房的位置,好累啊。弄得我寫博客的習(xí)慣都沒有按時完成。之前,我在看String.format的源碼時,發(fā)現(xiàn)了String.format其實(shí)內(nèi)服是使用了Formatter 類,但是自己對這個類不很了解,于是在網(wǎng)上查找資料,最終解決了問題。這里記錄一下。


先看看String.format的源碼:

public static String format(String format, Object... args) {return new Formatter().format(format, args).toString(); }

整理一下關(guān)于 Formatter 的用法

實(shí)例化一個Formatter

StringBuilder builder = new StringBuilder(); //builder 用來存儲格式化后的字符串 Formatter formatter = new Formatter(builder, Locale.CHINA);

format 方法,第一個參數(shù)是格式字符串,用來格式化后面的一個或多個參數(shù)。后面是一個可變參數(shù)列表。

public Formatter format(String format, Object ... args) {return format(l, format, args);}

格式字符串包含固定文本能夠嵌入一個或多個格式說明符。例如:

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

第一個參數(shù)是格式字符串,包含三個格式說明符,%1$tm %1$te,%1$tY,用來表明后
面的參數(shù) calendar 改怎樣被處理以及該插入到輸出文本的什么位置。格式化字符串剩余
的部分是固定的文本包括Duke's Birthday: 和其他的空格以及標(biāo)點(diǎn)符號。

通用類型,字符類型和數(shù)字類型的格式說明符語法如下:

%[argument_index$][flags][width][.precision]conversion

argument_index 選項(xiàng)是一個十進(jìn)制整數(shù),用來只是要被格式化的參數(shù)在參數(shù)列表中
的位置。第一個參數(shù)用“1$”表示,第二個參數(shù)用“2$”表示,以此類推。
也可以使用另外一種方式表示參數(shù)位置,就是使用‘<’,表示使用前一個格式化說明符指向的參數(shù)。

//下面兩行代碼表示都使用第一個參數(shù)。cCalendar 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);flags 選項(xiàng)是一組用來修改輸出格式的字符集,flags 合法的取值依賴conversion選項(xiàng)。width 選項(xiàng)是一個非負(fù)的整數(shù),表示要寫入輸出的最少字符數(shù)。precision 選項(xiàng)是一個非負(fù)的整數(shù),通常用來限制字符數(shù),具體的行為依賴conversion選項(xiàng)。

必選項(xiàng)conversion 是一個字符指示參數(shù)應(yīng)該怎樣被格式化。合法的conversion字符取值依賴于要被格式化的參數(shù)的數(shù)據(jù)類型

用來格式化日期和時間類型的格式說明符語法如下,和上面的語法相比少了精度選項(xiàng)。

%[argument_index$][flags][width]conversionargument_index ,flags,width 選項(xiàng)和上面的定義一樣。必選項(xiàng)conversion 是一個兩個字符的序列,第一個字符必須是’t’ or ‘T’,第二個字符用來格式化參數(shù)。

沒有參數(shù)對應(yīng)的格式說明符具有以下語法:

%[flags][width]conversionlags,width 選項(xiàng)和上面的定義一樣。必選項(xiàng)conversion是一個字符用來指示內(nèi)容應(yīng)該如何被插入到輸出中。

//沒有參數(shù)對應(yīng)格式[argument_index$],默認(rèn)每一個百分號后面的格式化字符串對應(yīng)一個參數(shù)。 //%tm 格式化 calendar1,%te 格式化 calendar2,%tR 格式化 calendar3 Calendar calendar1 = Calendar.getInstance(); Calendar calendar2 = Calendar.getInstance(); Calendar calendar3 = Calendar.getInstance(); String.format("Duke's Birthday: %tm,%te,%tR", calendar1,calendar2,calendar3)

Conversions 的分類

1:General 可用于任何參數(shù)類型 2:Character 可用于代表Unicode字符的基本類型:char, Character, byte, Byte, short,and Short;2.1 當(dāng) isValidCodePoint(int) returns true的時候(比如65 代表'A',97 代表'a'),這類conversion也可用于int and Integer類型3:Numeric3.1:Integral 整型的,可用于java的整型,byte, Byte, short, Short, int and Integer, long, Long, and BigInteger3.2:Floating Point浮點(diǎn)型 用于java 的浮點(diǎn)型 float, Float, double, Double, and BigDecimal4:Date/Time 可用于java中能夠編碼date或者time的類型:long, Long, Calendar, and Date5:Percent :產(chǎn)生一個文本'%' ('\u0025')6:Line Separator 換行

下表總結(jié)了一些轉(zhuǎn)換字符集的用法

Conversion參數(shù)分類描述
‘b’,’B’general如果要被各式話的參數(shù)是null,輸出結(jié)果是false,如果參數(shù)是一個boolean或者Boolean類型的數(shù)據(jù),輸出true或者false,其他情況返回true
‘h’,’H’general如果要被各式話的參數(shù)是null,輸出結(jié)果是null,其他情況輸出Integer.toHexString(arg.hashCode())
’s’,’S’general如果要被各式話的參數(shù)是null,輸出null,如果參數(shù)實(shí)現(xiàn)了Formattable接口(如果要自定義Formatter的‘s’轉(zhuǎn)換說明符的功能,需要實(shí)現(xiàn)Formattable接口),那么會調(diào)用arg.formatTo方法,除此之外,返回結(jié)果是arg.toString()
‘c’,’C’character結(jié)果是一個Unicode字符
‘d’integral結(jié)果是一個十進(jìn)制整數(shù)
‘o’integral結(jié)果是一個8進(jìn)制整數(shù)
‘x’,’X’integral結(jié)果是一個16進(jìn)制整數(shù)
‘e’,’E’floating point結(jié)果是一個用科學(xué)計數(shù)法表示的十進(jìn)制數(shù)字
‘f’floating point結(jié)果是一個十進(jìn)制數(shù)字
‘g’,’G’floating point根據(jù)參數(shù)的精度和四舍五入后的值來選擇使用科學(xué)計數(shù)法或者十進(jìn)制格式化
‘a(chǎn)’,’A’floating point結(jié)果是一個十進(jìn)制數(shù)字
‘f’floating point結(jié)果是一個用基數(shù)和指數(shù)表示的十六進(jìn)制浮點(diǎn)數(shù)
‘t’,’T’date/time日期和時間轉(zhuǎn)換字符集的第一個字符,下面細(xì)說
‘%’percent結(jié)果是一個%
‘n’line separator結(jié)果是一個換行符

Date/Time 類型的Conversions,開始第一個字符是’t’或者 ‘T’,然后才能選擇下表中的一個。

Conversions描述
‘H’24小時制,結(jié)果被格式化成兩位數(shù),如果必要以0開頭,比如07,(范圍00-23)
‘I’12小時制,結(jié)果被格式化成兩位數(shù),如果必要以0開頭,比如07,(范圍01-12)
‘k’24小時制,范圍(0-23)
‘l’12小時制,范圍(1-12)
‘M’一小時內(nèi)的分鐘數(shù),會被格式化為兩位數(shù),必要的話以0開頭,范圍(00-59)
‘S’一分鐘內(nèi)的秒數(shù),會被格式化為兩位數(shù),必要的話以0開頭,(范圍00-60,60是一個特殊的值,要求支持描述跳變)
‘L’一秒內(nèi)的毫秒數(shù),結(jié)果被格式化成3位數(shù)字,必要的話以0開頭范圍(000-999)
‘N’一秒內(nèi)的納秒數(shù),會被格式化成9位數(shù)字,必要的話以0開頭,范圍(000000000-999999999)
‘p’特定語言環(huán)境下,早上或者下午的小寫標(biāo)記,‘a(chǎn)m’或者‘pm’,可以使用轉(zhuǎn)化前綴‘T’,輸出大寫的‘AM’,或者‘PM’
‘z’RFC 822樣式的數(shù)字時區(qū)不同于GMT,例如 -0800。 該值將根據(jù)夏令時進(jìn)行調(diào)整。因?yàn)閷τ趌ong, Long, and Date,java虛擬機(jī)實(shí)例使用默認(rèn)的時區(qū)。
‘Z’表示時區(qū)縮寫的字符串。該值將根據(jù)夏令時進(jìn)行調(diào)整。因?yàn)閷τ趌ong, Long, and Date,java虛擬機(jī)實(shí)例使用默認(rèn)的時區(qū)。Formatter的語言環(huán)境會替代要被各式化的參數(shù)的語言環(huán)境。
’s’從UTC(協(xié)調(diào)世界時)1970年1月1日00:00:00開始的開始的秒數(shù),范圍Long.MIN_VALUE/1000到Long.MAX_VALUE/1000.
‘Q’從UTC(協(xié)調(diào)世界時)1970年1月1日00:00:00開始的開始的毫秒數(shù),范圍從 Long.MIN_VALUE/1000到Long.MAX_VALUE/1000.精度受操作系統(tǒng)或者硬件影響。

下列的conversion 字符用來格式化日期

Conversions描述
‘B’特定語言環(huán)境下的月份的全名,例如”January”, “February”
‘b’特定語言環(huán)境下的月份的簡稱,例如”Jan”, “Feb”.
‘h’特定語言環(huán)境下的月份的簡稱,例如”Jan”, “Feb”.
‘A’特定語言環(huán)境下的一周的某一天的全名,例如”Sunday”, “Monday”
‘a(chǎn)’特定語言環(huán)境下的一周的某一天的簡稱,例如”Sun”, “Mon”
‘C’四位的年數(shù)除以100,格式化成兩位數(shù),如果有必要的話,以0開頭。范圍(00 - 99)
‘Y’年,被格式化成至少4位整數(shù),必要的話,以0開頭。例如0092就是格林尼治時間的公元92年。
‘y’年的最后兩位,如果必要,以0開頭(范圍00-99)
‘j’一年的某一天,被格式化成3位數(shù),范圍(0-366)
‘m’月,被格式化成兩位數(shù),必要的話以0開頭,范圍(01,13)
‘d’一個月中的某一天,被格式化成兩位,如果必要的話,以0開頭,范圍(01,31)
‘e’一個月中的某一天,被格式化成兩位 范圍(1 - 31)

下面的conversion 字符串是格式化date/time的組合。

Conversions描述
‘R’把時間格式化成24小時的格式,和”%tH:%tM” 效果一樣
‘T’把時間格式化成24小時的格式,和 “%tH:%tM:%tS” 效果一樣
‘r’把時間格式化成24小時的格式, 和”%tI:%tM:%tS %Tp”效果一樣早晨或下午標(biāo)記(’%Tp’)是依賴于區(qū)域設(shè)置的。
‘F’被格式化成 ISO 8601完整格式的日期 等價于 “%tY-%tm-%td”.
‘D’日期格式化,和 “%tY-%tm-%td”效果一樣
‘c’日期格式化,和 “%ta %tb %td %tT %tZ %tY”效果一樣,例如 “Sun Jul 20 16:17:00 EDT 1969”

注意

'B', 'H', 'S', 'C', 'X', 'E', 'G', 'A', and 'T'

這幾個converion 大寫小寫都可以,輸出結(jié)果也會對應(yīng)輸出大小寫。

下表是可用的flags。y 表示對應(yīng)的參數(shù)類型可用,no 表示對應(yīng)的參數(shù)類型不可用。

FlagGeneralCharacterIntegralFloat PointDate/Time描述
‘-‘yyyyy輸出結(jié)果左對齊
‘#’y1noy3yno輸出結(jié)果和conversion相關(guān)的變換格式
‘+’nonoy4yno輸出結(jié)果包括一個符號
’ ‘(空格)nonoy4yno如果輸出結(jié)果是一個正數(shù),結(jié)果前面會有一個空格
‘0’nonoyyno如果輸出結(jié)果的寬度小于指定的寬度,用0來補(bǔ)齊
‘,’(逗號)nonoy2y5no輸出結(jié)果包括特定語言環(huán)境下的組分隔符,類似這樣,格式化100000,輸出100,000
‘(‘nonoy4y5no輸出結(jié)果會把負(fù)值用括號包起來,類似這樣,格式化-100,輸出(100)

注意

  • y1 ,結(jié)果取決于Formattable的定義。(可以通過實(shí)現(xiàn)Formattable接口自定義conversion.)
  • y2后面的conversion 必須是‘d’.
  • y3后面的conversion 只能是 ‘o’,’x’,’X’。
  • y4后面的conversion 可以使用于BigInteger的’d’, ‘o’, ‘x’, and ‘X’ ,或者是用于 byte, Byte, short, Short, int and Integer, long, and Long類型的‘d’。
  • y5后面的conversion 只能是 ‘e’, ‘E’, ‘f’, ‘g’。

    Width

    width 是輸出結(jié)果最少的字符數(shù)。不能用于換行符。

    Precision(精度)

    對于通用類型Conversions ,精度是輸出結(jié)果最少的字符數(shù)。
    對于浮點(diǎn)型Conversions :’e’, ‘E’, and ‘f’,精度表示小數(shù)點(diǎn)后保留幾位小數(shù);如果conversion是 ‘g’ or ‘G’,精度表示四舍五入以后,結(jié)果的總位數(shù);如果conversion是“a”或“A”,則不能指定精度。

    光說不練假把式一個個試試看結(jié)果。

  • StringBuilder builder = new StringBuilder();Formatter formatter = new Formatter(builder, Locale.CHINA);formatter.format("%1$b %2$b %3$b", null, true, 124);Log.e(tag, builder.toString());//輸出結(jié)果MainActivity: false true truebuilder.delete(0, builder.length()); formatter.format("%1h %2h %3h", null, 64); Log.e(tag, builder.toString());//輸出結(jié)果 MainActivity: null 40builder.delete(0, builder.length()); formatter.format("%1$s , %2$s", null, 23); Log.e(tag, builder.toString());//輸出MainActivity: null , 23builder.delete(0, builder.length()); formatter.format("%1$c %2$c %3$c", 'c',65,97); Log.e(tag, builder.toString());//輸出MainActivity: c A abuilder.delete(0, builder.length()); formatter.format("十進(jìn)制:%1$d 八進(jìn)制:%1$#o 十六進(jìn)制:%1$#x", 127); Log.e(tag, builder.toString());//輸出MainActivity: 十進(jìn)制:127 八進(jìn)制:0177 十六進(jìn)制:0x7f/*如果使用‘#’這個flag,八進(jìn)制的輸出結(jié)果前面會有一個0,十六進(jìn)制輸出結(jié)果前面有一個0x對 于八進(jìn)制和十六進(jìn)制,如果 要被各式化的參數(shù)是一個負(fù)數(shù),那么結(jié)果會加上一個2 的n次方的 值從而成為一個無符號數(shù), n就是對應(yīng)數(shù)據(jù)類型的位數(shù),下面的例子中127和-127都是32位的。 */builder.delete(0, builder.length()); formatter.format("十進(jìn)制:%1$d 八進(jìn)制:%1$#o 十六進(jìn)制:%1$#x", -127); Log.e(tag, builder.toString());//輸出十進(jìn)制:-127 八進(jìn)制:037777777601 十六進(jìn)制:0xffffff81builder.delete(0, builder.length());formatter.format("%1$d %2$d %1$+d %2$+d %1$ d %2$ d %1$08d %2$08d %1$,8d %2$,8d %1$(8d %2$(8d", 12700,-12700);Log.e(tag, builder.toString()); /*輸出MainActivity: 12700 -12700 +12700 -12700 12700 -12700 00012700 -0012700 12,700 -12,700 12700 (12700)*//**-------------BigInteger 轉(zhuǎn)化成八進(jìn)制或者十六進(jìn)制-----------------------*/builder.delete(0, builder.length());BigInteger bigInteger2 = new BigInteger("-64", 10);BigInteger bigInteger1 = new BigInteger("64", 10);formatter.format("%1$o %2$o,%1$+#x %2$+#x,%1$010x %2$010x", bigInteger1, bigInteger2);Log.e(tag, builder.toString());//輸出MainActivity: 100 -100,+0x40 -0x40,0000000040 -000000040/**---------------------------------------------------------*//**--------------float, Float, double and Double,BigDecimal----------------------*///關(guān)于flag 'g',默認(rèn)精度是6.要被各式化的數(shù)字的絕對值 m;//如果0.0001<=m<=10的precision次方,就把結(jié)果格式化成十進(jìn)制格式 //如果m<0.0001 or m>10的precision次方,就把結(jié)果用科學(xué)計數(shù)法表示。builder.delete(0, builder.length()); float a = 1220000; float b = 100; formatter.format("%1$e %1$.4e,%1$g %1$.4g,%1$.3f", a); Log.e(tag, builder.toString()); builder.delete(0, builder.length()); formatter.format("%1$e %1$.4e,%1$g %1$.4g,%1$.3f", b); Log.e(tag, builder.toString()); builder.delete(0, builder.length()); formatter.format("%1$e %1$.4e,%1$g %1$.4g,%1$.3f", -1220000f); Log.e(tag, builder.toString()); builder.delete(0, builder.length()); formatter.format("%1$e %1$.4e,%1$g %1$.4g,%1$.3f", -100f); Log.e(tag, builder.toString());/** MainActivity: 1.220000e+06 1.2200e+06,1.22000e+06 1.220e+06,1220000.000 MainActivity: 1.000000e+02 1.0000e+02,100.000 100.0,100.000 MainActivity: -1.220000e+06 -1.2200e+06,-1.22000e+06 -1.220e+06,-1220000.000 MainActivity: -1.000000e+02 -1.0000e+02,-100.000 -100.0,-100.000*///關(guān)于BigDecimalBigDecimal bigDecimal1 = new BigDecimal("1220000");BigDecimal bigDecimal2 = new BigDecimal("-1220000");BigDecimal bigDecimal3 = new BigDecimal("0");builder.delete(0, builder.length());formatter.format("%1$e %1$.4e,%1$g %1$.4g,%1$.3f", bigDecimal1);Log.e(tag, builder.toString());builder.delete(0, builder.length());formatter.format("%1$e %1$.4e,%1$g %1$.4g,%1$.3f", bigDecimal2);Log.e(tag, builder.toString());builder.delete(0, builder.length());formatter.format("%1$e %1$.4e,%1$g %1$.4g,%1$.3f", bigDecimal3);Log.e(tag, builder.toString());//輸出 /**MainActivity: 1.220000e+06 1.2200e+06,1.22000e+06 1.220e+06,1220000.000MainActivity: -1.220000e+06 -1.2200e+06,-1.22000e+06 -1.220e+06,-1220000.000MainActivity: 0.000000e+00 0.0000e+00,0.00000 0.000,0.000*//*-------------------------------------------------------------*/

    Date/Time

    conversion 第一個字符必須是 ‘t’or ‘T’

    Date date = new Date();long time = date.getTime();builder.delete(0, builder.length());formatter.format("%1$tH:%1$tM:%1$tS %1$tp", time);Log.e(tag, builder.toString());//MainActivity: 13:37:37 下午builder.delete(0, builder.length());formatter.format("%1$tR", time);Log.e(tag, builder.toString());//13:37builder.delete(0, builder.length());formatter.format("%1$tT", time);Log.e(tag, builder.toString());//13:37:37builder.delete(0, builder.length());formatter.format("%1$tr", time);Log.e(tag, builder.toString());//01:37:37 下午builder.delete(0, builder.length());formatter.format("%1$tY-%1$tm-%1$td %1$tB %1$ta", date);Log.e(tag, builder.toString());//2017-01-14 一月 周六builder.delete(0, builder.length());formatter.format("%1$tD", date);Log.e(tag, builder.toString());//01/14/17builder.delete(0, builder.length());formatter.format("%1$tF", date);Log.e(tag, builder.toString());//2017-01-14builder.delete(0, builder.length());formatter.format("%1$tc", date);Log.e(tag, builder.toString());//周六 1月 14 13:37:37 GMT+08:00 2017
    Percent and Line Separator

    builder.delete(0, builder.length());formatter.format("%1$d%%100%n good afternoon", 100);Log.e(tag, builder.toString());//輸出結(jié)果MainActivity: 100%100good afternoon有一個換行。

    簡單講講,其實(shí)Formatter格式化字符和之前的String.format基本一致,因?yàn)镾tring.format內(nèi)部就是調(diào)用的formatter.format。formatter.format的第一個參數(shù)傳格式化的字符串,需要符合一些要求。下面在具體的講講。

    1.對整數(shù)進(jìn)行格式化%[index$][標(biāo)識][最小寬度]轉(zhuǎn)換方式


    我們可以看到,格式化字符串由4部分組成,其中%[index$]的含義我們上面已經(jīng)講過,[最小寬度]的含義也很好理解,就是最終該整數(shù)轉(zhuǎn)化的字符串最少包含多少位數(shù)字。我們來看看剩下2個部分的含義吧:

    ?

    標(biāo)識:?
    '-'????在最小寬度內(nèi)左對齊,不可以與“用0填充”同時使用
    '#'????只適用于8進(jìn)制和16進(jìn)制,8進(jìn)制時在結(jié)果前面增加一個0,16進(jìn)制時在結(jié)果前面增加0x
    '+'????結(jié)果總是包括一個符號(一般情況下只適用于10進(jìn)制,若對象為BigInteger才可以用于8進(jìn)制和16進(jìn)制)
    '??'????正值前加空格,負(fù)值前加負(fù)號(一般情況下只適用于10進(jìn)制,若對象為BigInteger才可以用于8進(jìn)制和16進(jìn)制)
    '0'????結(jié)果將用零來填充
    ','????只適用于10進(jìn)制,每3位數(shù)字之間用“,”分隔
    '('????若參數(shù)是負(fù)數(shù),則結(jié)果中不添加負(fù)號而是用圓括號把數(shù)字括起來(同‘+
    ’具有同樣的限制)

    轉(zhuǎn)換方式:
    d
    -十進(jìn)制???o-八進(jìn)制???x或X-十六進(jìn)制

    ?

    ??????? 上面的說明過于枯燥,我們來看幾個具體的例子。需要特別注意的一點(diǎn)是:大部分標(biāo)識字符可以同時使用。

    ?

    ????????System.out.println(String.format("%1$,09d",?-3123));
    ????????System.out.println(String.format(
    "%1$9d",?-31
    ));
    ????????System.out.println(String.format(
    "%1$-9d",?-31
    ));
    ????????System.out.println(String.format(
    "%1$(9d",?-31
    ));
    ????????System.out.println(String.format(
    "%1$#9x",?5689
    ));

    //
    結(jié)果為:
    //
    -0003,123
    //
    ??????-31
    //
    -31??????
    //
    ?????(31)
    //???0x1639

    ?



    2.對浮點(diǎn)數(shù)進(jìn)行格式化%[index$][標(biāo)識][最少寬度][.精度]轉(zhuǎn)換方式
    ??????? 我們可以看到,浮點(diǎn)數(shù)的轉(zhuǎn)換多了一個“精度”選項(xiàng),可以控制小數(shù)點(diǎn)后面的位數(shù)。

    ?

    標(biāo)識:?
    '-'????在最小寬度內(nèi)左對齊,不可以與“用0填充”同時使用
    '+'????結(jié)果總是包括一個符號
    '??'????正值前加空格,負(fù)值前加負(fù)號
    '0'????結(jié)果將用零來填充
    ','????每3位數(shù)字之間用“,”分隔(只適用于fgG的轉(zhuǎn)換)
    '('
    ????若參數(shù)是負(fù)數(shù),則結(jié)果中不添加負(fù)號而是用圓括號把數(shù)字括起來(只適用于eEfgG的轉(zhuǎn)換)

    轉(zhuǎn)換方式:
    'e',?'E'??--??結(jié)果被格式化為用計算機(jī)科學(xué)記數(shù)法表示的十進(jìn)制數(shù)
    'f'??????????--??結(jié)果被格式化為十進(jìn)制普通表示方式
    'g',?'G'????--??根據(jù)具體情況,自動選擇用普通表示方式還是科學(xué)計數(shù)法方式
    'a',?'A'????--???結(jié)果被格式化為帶有效位數(shù)和指數(shù)的十六進(jìn)制浮點(diǎn)數(shù)

    3.對字符進(jìn)行格式化
    ??????? 對字符進(jìn)行格式化是非常簡單的,c表示字符,標(biāo)識中'-'表示左對齊,其他就沒什么了。

    4.對百分比符號進(jìn)行格式化
    ???????
    看了上面的說明,大家會發(fā)現(xiàn)百分比符號“%”是特殊格式的一個前綴。那么我們要輸入一個百分比符號該怎么辦呢?肯定是需要轉(zhuǎn)義字符的,但是要注意的是,在這里轉(zhuǎn)義字符不是“\”,而是“%”。換句話說,下面這條語句可以輸出一個“12%”:
    System.out.println(String.format("%1$d%%", 12));

    5.取得平臺獨(dú)立的行分隔符
    ??????? System.getProperty("line.separator")可以取得平臺獨(dú)立的行分隔符,但是用在format中間未免顯得過于煩瑣了。于是format函數(shù)自帶了一個平臺獨(dú)立的行分隔符那就是
    String.format("%n")。

    6.對日期類型進(jìn)行格式化
    ???????? 以下日期和時間轉(zhuǎn)換的后綴字符是為 't' 和 'T' 轉(zhuǎn)換定義的。這些類型相似于但不完全等同于那些由 GNU date 和 POSIX strftime(3c) 定義的類型。提供其他轉(zhuǎn)換類型是為了訪問特定于 Java 的功能(如將 'L' 用作秒中的毫秒)。

    以下轉(zhuǎn)換字符用來格式化時間:

    'H' ??? 24 小時制的小時,被格式化為必要時帶前導(dǎo)零的兩位數(shù),即 00 - 23。
    'I' ??? 12 小時制的小時,被格式化為必要時帶前導(dǎo)零的兩位數(shù),即 01 - 12。
    'k' ??? 24 小時制的小時,即 0 - 23。
    'l' ??? 12 小時制的小時,即 1 - 12。
    'M' ??? 小時中的分鐘,被格式化為必要時帶前導(dǎo)零的兩位數(shù),即 00 - 59。
    'S' ??? 分鐘中的秒,被格式化為必要時帶前導(dǎo)零的兩位數(shù),即 00 - 60 ("60" 是支持閏秒所需的一個特殊值)。
    'L' ??? 秒中的毫秒,被格式化為必要時帶前導(dǎo)零的三位數(shù),即 000 - 999。
    'N' ??? 秒中的毫微秒,被格式化為必要時帶前導(dǎo)零的九位數(shù),即 000000000 - 999999999。
    'p' ??? 特定于語言環(huán)境的 上午或下午 標(biāo)記以小寫形式表示,例如 "am" 或 "pm"。使用轉(zhuǎn)換前綴 'T' 可以強(qiáng)行將此輸出轉(zhuǎn)換為大寫形式。
    'z' ??? 相對于 GMT 的 RFC 822 格式的數(shù)字時區(qū)偏移量,例如 -0800。
    'Z' ??? 表示時區(qū)縮寫形式的字符串。Formatter 的語言環(huán)境將取代參數(shù)的語言環(huán)境(如果有)。
    's' ??? 自協(xié)調(diào)世界時 (UTC) 1970 年 1 月 1 日 00:00:00 至現(xiàn)在所經(jīng)過的秒數(shù),即 Long.MIN_VALUE/1000 與 Long.MAX_VALUE/1000 之間的差值。
    'Q' ??? 自協(xié)調(diào)世界時 (UTC) 1970 年 1 月 1 日 00:00:00 至現(xiàn)在所經(jīng)過的毫秒數(shù),即 Long.MIN_VALUE 與 Long.MAX_VALUE 之間的差值。

    以下轉(zhuǎn)換字符用來格式化日期:
    'B' ??? 特定于語言環(huán)境的月份全稱,例如 "January" 和 "February"。
    'b' ??? 特定于語言環(huán)境的月份簡稱,例如 "Jan" 和 "Feb"。
    'h' ??? 與 'b' 相同。
    'A' ??? 特定于語言環(huán)境的星期幾全稱,例如 "Sunday" 和 "Monday"
    'a' ??? 特定于語言環(huán)境的星期幾簡稱,例如 "Sun" 和 "Mon"
    'C' ??? 除以 100 的四位數(shù)表示的年份,被格式化為必要時帶前導(dǎo)零的兩位數(shù),即 00 - 99
    'Y' ??? 年份,被格式化為必要時帶前導(dǎo)零的四位數(shù)(至少),例如,0092 等于格里高利歷的 92 CE。
    'y' ??? 年份的最后兩位數(shù),被格式化為必要時帶前導(dǎo)零的兩位數(shù),即 00 - 99。
    'j' ??? 一年中的天數(shù),被格式化為必要時帶前導(dǎo)零的三位數(shù),例如,對于格里高利歷是 001 - 366。
    'm' ??? 月份,被格式化為必要時帶前導(dǎo)零的兩位數(shù),即 01 - 13。
    'd' ??? 一個月中的天數(shù),被格式化為必要時帶前導(dǎo)零兩位數(shù),即 01 - 31
    'e' ??? 一個月中的天數(shù),被格式化為兩位數(shù),即 1 - 31。

    以下轉(zhuǎn)換字符用于格式化常見的日期/時間組合。
    'R' ??? 24 小時制的時間,被格式化為 "%tH:%tM"
    'T' ??? 24 小時制的時間,被格式化為 "%tH:%tM:%tS"。
    'r' ??? 12 小時制的時間,被格式化為 "%tI:%tM:%tS %Tp"。上午或下午標(biāo)記 ('%Tp') 的位置可能與語言環(huán)境有關(guān)。
    '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"。


    簡單講講,其實(shí)格式化不同的內(nèi)容,format參數(shù)的要求是不一樣的。最常用的形式是%[index$][標(biāo)識][最少寬度][.精度]轉(zhuǎn)換方式來格式化整數(shù)或浮點(diǎn)數(shù),其他的大家可以看看,上面講的很詳細(xì),這里總結(jié)的話好難。

    還有需要注意一點(diǎn),Formatter formatter = new Formatter(builder, Locale.CHINA);每次格式化后需要報builder的內(nèi)容清空,不然每次的結(jié)果會拼接起來,導(dǎo)致輸出結(jié)果不正確。每次調(diào)用formatter.format();后調(diào)用builder.delete(0, builder.length())清空就可以了。

    android Formatter 的使用就講完了。


    就這么簡單。

    總結(jié)

    以上是生活随笔為你收集整理的android Formatter 的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。