天天看點

C#中的 String.format()方法用法解說

轉載:https://blog.csdn.net/jiangyu1013/article/details/52607257

JDK1.5開始String類中提供了一個非常有用的方法String.format(String format, Object ... args)

檢視源碼得知其實是調用了java.util.Formatter.format(String, Object...)方法

  1. public static String format(String format, Object ... args) {

  2. return new Formatter().format(format, args).toString();

  3. }

String.format(String format, Object ... args) 這個方法最重要的的地方就是它的第一個參數String format,我們隻要掌握了這個參數的用法也就掌握了String.format的用法

首先來看一個列子

  1. String s2 = String.format("%1$tY-%1$tm-%1$te", new Date());

  2. System.out.println(s2);

這裡會列印出什麼内容?

先不急着去運作它,相信閱讀到後面不用運作,你也會知道的.

檢視JDK文檔得知,String.format方法的第一個參數是有個公式可以套的

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

這裡我們隻要牢記這個公式就可以,下面說下每個顔色所代表的含義

argument_index: 可選,是一個十進制整數,用于表明參數在參數清單中的位置。第一個參數由 "1$" 引用,第二個參數由 "2$" 引用,依此類推。

flags: 可選,用來控制輸出格式

width: 可選,是一個正整數,表示輸出的最小長度

precision:可選,用來限定輸出字元數

conversion:必須,用來表示如何格式化參數的字元

先看一個簡單的列子:

System.out.println(String.format("我的名字叫%s", "小明")); // 列印:我的名字叫小明
           

這裡我們隻用了%s這個簡單的表達式,對比上面的公式,我們發現[argument_index$][flags][width][.precision]這些部分全部都省略掉了

隻留下一個必須的conversion,在這裡conversion就是"s",百分号%是固定不變的

[argument_index$]省略之後它會自動把"小明"這個值填入到%s中去

我再稍微改下列子:

String.format("我叫%s,她叫%s", "小明","小方"); // 我叫小明,她叫小方
           

這裡會按順序分别把小明,小方填入到對應的%s中. 如果我們要把小方填在前面,小明填在後面,那該怎麼做呢,[argument_index$]就派上用場了

String.format("我叫%2$s,她叫%1$s", "小明","小方"); // 我叫小方,她叫小明
           

依然是百分号%開頭,中間多了個2$,1$

conversion可以填s,那還有什麼其它字母可以填呢,當然有的比如

o:結果被格式化為八進制整數

x:結果被格式化為十六進制

d:結果被格式化為十進制整數

  1. System.out.println(String.format("%o", 8)); // 10

  2. System.out.println(String.format("%x", 16)); // 10

更多的conversion類别可以參考JDK文檔java.util.Formatter類

至此,我們已經了解了argument_index$和conversion的用處,接下來我們了解flag和width的用法

flag是用來控制輸出格式的,比如左對齊,金額用逗号隔開等

width:表示最小寬度

先看個列子:

String.format("%1$,d", 12302562); // 12,302,562
           

這裡多出一個逗号",",它就是flag,用于金額千分位隔開,當然寫成"%,d"也是可以的

再一個列子:

String.format("%1$08d", 123456);// 00123456
           

這裡0就是flag,表示結果将用零來填充,8就是width,表示最少要8位,d是conversion

至于其它的flag可以查閱JDK文檔

接下來說下[.precision]

這個單詞翻譯下是精度的意思,我們發現了前面有個小數點".",是以不難聯想到這個是關于浮點數類型的

隻有當傳入的資料是浮點數時這個才有用,整數或者日期類型的資料都不能用

比如我想要四舍五入保留兩位小數,那麼我可以這麼寫:

String.format("%1$.2f", 12.12555);// 12.13
           

這裡f表示傳入的數字是浮點型,如果傳入的是整數,或者把f改成d都會抛出異常,JDK文檔中有明确說明

對于浮點轉換 'e'、'E' 和 'f',精度是小數點分隔符後的位數。如果轉換是 'g' 或 'G',那麼精度是舍入計算後所得數值的所有位數。如果轉換是 'a' 或 'A',則不必指定精度。

對于字元、整數和日期/時間參數類型轉換,以及百分比和行分隔符轉換,精度是不适用的;如果提供精度,則會抛出異常。

到現在為止這套表達式公式已經基本講完了,這套公式是針對于基本資料類型,和字元串的,如果是正對于時間類型的資料該怎麼做呢,比如格式化日期

其實文檔中已經給出說明了:

用來表示日期和時間類型的格式說明符的文法如下:

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

可選的 argument_index、flags 和 width 的定義同上。

所需的 conversion 是一個由兩字元組成的序列。第一個字元是 't' 或 'T'。第二個字元表明所使用的格式。這些字元類似于但不完全等同于那些由 GNU date 和 POSIX strftime(3c) 定義的字元。

需要注意的是conversion 是一個由兩字元組成的序列。第一個字元是 't' 或 'T'。

也就是說用conversion的時候首先必要寫一個"t",然後在寫其它conversion

時間類型有它自己的一套conversion,我們簡單的選擇幾個來說:

'Y' 年份,被格式化為必要時帶前導零的四位數(至少),例如,0092 等于格裡高利曆的 92 CE。
'm' 月份,被格式化為必要時帶前導零的兩位數,即 01 - 13。
'd' 一個月中的天數,被格式化為必要時帶前導零兩位數,即 01 - 31

上面三個分别表示年月日

如果我要顯示年份,我就可以"%tY",顯示月份我就可以寫"%tm",記得一定要帶上"t"

那麼本篇一開始提到的那串複雜的表達式現在看來是不是很簡單呢:

  1. String s2 = String.format("%1$tY-%1$tm-%1$te", new Date());

  2. System.out.println(s2);

String.format()方法差不多講完了,仔細看JDK文檔也會慢慢了解的

需要批量進行格式化時,考慮下DateFormat, MessageFormat, NumberFormat 把他們封裝成一個靜态工具類或許更好

畢竟調用String.format()方法是會new一個Formatter對象,雖然有GC幫忙,但是平時程式設計的時候還是要考慮這些因素的

盡量少的建立對象,節省資源

c#