本文參考:
- http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Formatter.html
- http://www.blogjava.net/AS-COM/archive/2011/03/15/346321.html?opt=admin
有時會想把數字,日期,字元串按照給定規則給格式化。SUN JDK為我們提供了這個API,它是java.util.Formatter。此類提供了對布局對齊和排列的支援,以及
對數值、字元串和日期/時間資料的正常格式和特定于語言環境的輸出的支援。
如何格式化?
給定規則:
要想按照自己的想法格式化必須事先編寫一個規則。那這個規則要怎麼編寫?
1.正常類型、字元類型和數值類型的格式說明符的文法如下:
%[argument_index$][flags][width][.precision]conversion
2.用來表示日期和時間類型的格式說明符的文法如下:
%[argument_index$][flags][width]conversion
3.與參數不對應的格式說明符的文法如下:
%[flags][width]conversion
API中有這樣三種規則,很顯然第一個規則的内容是最全面的。其它規則的内容和第一規則的内容有重複,那單說第一規則内容,其它規則依次類推。
注意:規則一中的precision前面要加英文句号“.”
API有以下解釋:
可選的
argument_index 是一個十進制整數,用于表明參數在參數清單中的位置。第一個參數由 "1$"引用,第二個參數由"2$"引用,依此類推。
可選
flags 是修改輸出格式的字元集。有效标志集取決于轉換類型。
width 是一個非負十進制整數,表明要向輸出中寫入的最少字元數。
precision 是一個非負十進制整數,通常用來限制字元數。特定行為取決于轉換類型。
所需
conversion 是一個表明應該如何格式化參數的字元。給定參數的有效轉換集取決于參數的資料類型。
argument_index很好了解,就是一參數占位符,用來表示要被格式化的參數。
flags
标志 | 正常 | 字元 | 整數 | 浮點 | 日期/時間 | 說明 |
'-' | y | 結果将是左對齊的。 | ||||
'#' | y1 | - | y3 | 結果應該使用依賴于轉換類型的替換形式 | ||
'+' | y4 | 結果總是包括一個符号 | ||||
' ' | 對于正值,結果中将包括一個前導空格 | |||||
'0' | 結果将用零來填充 | |||||
',' | y2 | y5 | 結果将包括特定于語言環境的 組分隔符 | |||
'(' | 結果将是用圓括号括起來的負數 |
1 取決于
Formattable的定義。
2 隻适用于 'd'轉換。
3 隻适用于 'o'、'x'和'X'轉換。
4 對
BigInteger應用 'd'、'o'、'x'和'X'轉換時,或者對byte及
Byte、short及
Short、int及
Integer、long及
Long分别應用 'd' 轉換時适用。
5 隻适用于 'e'、'E'、'f'、'g'和'G'轉換。
任何未顯式定義為标志的字元都是非法字元,并且都被保留,以供擴充使用。
width 就表示一最少字元數,被格式化參數用precision 截取器截取後與width 相比,被格式化參數字元數如果小于width ,則加字元則到等于width 。如果大于則width 不起作用。是以可以叫width 為少加多過器。
precision 在上面也提到了,precision 是一個截取器,用于截取被格式化參數。
conversion 轉換可分為以下幾類:
正常-可應用于任何參數類型
字元-可應用于表示Unicode字元的基本類型:char、
Character、byte、
、short和
。當
Character.isValidCodePoint(int)傳回 true時,可将此轉換應用于 int和
類型
數值
1整數-可應用于Java的整數類型:byte、
、short、
、int、
、long、
和
2浮點-可用于Java的浮點類型:float、
Float、double、
Double BigDecimal日期/時間-可應用于Java的、能夠對日期或時間進行編碼的類型:long、
、
Calendar Date。
百分比-産生字面值'%' ('\u0025')
行分隔符-産生特定于平台的行分隔符
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 實作 ,則調用 arg.formatTo。否則,結果為調用 arg.toString() 得到的結果。 | |
C c | 結果是一個 Unicode字元 | |
d | 結果被格式化為十進制整數 | |
o | 結果被格式化為八進制整數 | |
X x | 結果被格式化為十六進制整數 | |
E e | 結果被格式化為用計算機科學記數法表示的十進制數 | |
f | 結果被格式化為十進制數 | |
G g | 根據精度和舍入運算後的值,使用計算機科學記數形式或十進制格式對結果進行格式化。 | |
A a | 結果被格式化為帶有效位數和指數的十六進制浮點數 | |
日期,日間 | T t | 日期和時間轉換字元的字首 |
百分比 | % | 結果為字面值 '%' |
行分隔符 | n | 結果為特定于平台的行分隔符 |
常出現的異常
java.util.IllegalFormatConversionException: d != java.lang.Double
: 被格式化參數類型與規則轉換類型不對應。
java.util.FormatFlagsConversionMismatchException: Conversion = d, Flags = # : flag不适用于規則轉換類型。
Formatter類是用正規表達式驗證給定規則的
正規表達式如下:
private static final
String formatSpecifier
=
"%(\\d+\\$)?([-#+0,(\\<]*)?(\\d+)?(\\.\\d+)?([tT])?([a-zA-Z%])";
總結:
- 最重要的是它可以格式化日期/時間,數值和字元。
-
可以把日期轉換成年,月,日,星期等。可以為數值填充空格或0,添加分組字元,正負号,及小括号。我們可以在System.out.format
(),String.format()方法中直接應用Formatter類。
下面貼一段代碼,将Android中的播放器的進度值之轉換為相應的時間
/**
* 格式化的格式
*/
private StringBuilder sFormatBuilder = new StringBuilder();
/**
* 格式化類
*/
private Formatter sFormatter = new Formatter(sFormatBuilder, Locale.getDefault());
/**
* 格式化的相關屬性
*/
private final Object[] sTimeArgs = new Object[3];
/**
* 轉換進度值為時間
* @param secs
* @return
*/
private String makeTimeString(int secs) {
/**
* %[argument_index$][flags][width]conversion
* 可選的 argument_index 是一個十進制整數,用于表明參數在參數清單中的位置。第一個參數由 "1$" 引用,第二個參數由 "2$" 引用,依此類推。
可選 flags 是修改輸出格式的字元集。有效标志集取決于轉換類型。
可選 width 是一個非負十進制整數,表明要向輸出中寫入的最少字元數。
可選 precision 是一個非負十進制整數,通常用來限制字元數。特定行為取決于轉換類型。
所需 conversion 是一個表明應該如何格式化參數的字元。給定參數的有效轉換集取決于參數的資料類型。
*/
String durationformat = getString(R.string.durationformat);//<xliff:g id="format">%1$02d:%2$02d:%3$02d</xliff:g>
sFormatBuilder.setLength(0);
secs = secs / 1000;
Object[] timeArgs = sTimeArgs;
timeArgs[0] = secs / 3600; //時
timeArgs[1] = (secs % 3600) / 60; //分
timeArgs[2] = (secs % 3600 % 60) % 60; //秒
return sFormatter.format(durationformat, timeArgs).toString().trim();
}
其中R.string.durationformat定義如下:
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="durationformat" translatable="false"><xliff:g id="format">%1$02d:%2$02d:%3$02d</xliff:g></string>
</resources>
關于格式化時間,還可以參考我的部落格
《我的Java開發學習之旅------>工具類:将播放器的進度值轉換成相應的時間格式》
位址:http://blog.csdn.net/ouyang_peng/article/details/17164255
什麼是xliff?可以參考
http://baike.baidu.com/view/4160854.htm====================================================================================
作者:歐陽鵬 歡迎轉載,與人分享是進步的源泉!
轉載請保留原文位址:
http://blog.csdn.net/ouyang_peng