天天看點

《我的Java開發學習之旅------>工具類:将播放器的進度值轉換成相應的時間格式》

本文參考:

有時會想把數字,日期,字元串按照給定規則給格式化。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

繼續閱讀