[C#] 字串格式(String Format)心得筆記

字串格式(String Format)心得筆記

每次編程到處理字串時,若不是當時常常在用,不然老是要重新回去再問谷哥,MSDN,或是翻書一下,這邊把自己比較在意的幾個點紀錄一下

先從格式的主架構開始~GO~


字串格式結構

參照MSDN上的說明,但是他的自動翻譯真的是…讓人有點摸不著頭腦的FU,我把它改一下 XD

{index[,alignment][:formatString]}
  • index 變數索引
    • 變數或是表示變數的索引值,索引值以0開始
  • alignment 對齊控制參數
    • 此欄位為具有正負號的整數或是省略;整數表示靠右對齊整數表示靠左對齊
  • formatString 格式型態參數
    • 此欄位為表示格式型態樣式的字串修飾詞或是省略

以上就是說用 , 接著對齊控制修的飾詞,用 : 接著格式型態的修飾詞

另外是MSDN上說到 index 變數索引好像只能放索引值或是保持 null 為空字串,但實務上我直接放字串變數也是可以的,回頭一想文中說放 null 這件事不就是可以放字串嗎?(腦補 XD)


對齊控制參數

MSDN上把這項分控制項間距控制項對齊兩節敘述,說人話就是正負號(控制項對齊)數值大小(控制項間距)的差別而已,以下看例子來體會

int i = 1234.56789;   // 共10個字元
string s = "ABCDEF";  // 共8個字元
string o;

o = i.ToString("0,-12") + "," + s.Format("0,12");
Console.WriteLine(o);
// 輸出:1234.56789  ,    ABCDEF
//                ^^ ^^^^

o = String.Format("0,10", s);
Console.WriteLine(o);
// 輸出:  ABCDEF
//      ^^

Console.WriteLine("{0,-8}", i);
// 輸出:1234.56789
// 預留空格小於變數位數就直接顯示整串變數內容

這例子放進去 ToString, Format 等等幾個函式交替應用,避免日後我又一時腦打結 XD

補充範例的資訊,我從開參考的MSDN那邊看到的範例裡 Console.WriteLine 後面接的字串內變數有一個是變數所以要加修飾詞 $,其他都是索引值就沒加 $ 了~這部分要注意一下囉~


格式型態參數

這部分是網路上大大們最常分享的部分,以下就用我找到整理最詳細的文章帶過 XD

以下參考 Marcus 大大的 [C#] string.Format 格式整理

標準數值格式

格式說明FormatInputOutput補充
C貨幣{0:C}1234.567NT$1,234.57Currency :C預設到小數2位…C1取小數一位,C3取小數三位…
D十進位{0:D}12341234Decimal: 只支援整數資料型別(integral types),D後面數字表示指定的位數
E科學指數{0:E}12341.234000E+003Scientific
F固定{0:F}1234.45671234.46Fixed-point
G一般{0:G}1234.5671234.57General
N數字{0:N}120000120,000.00Number:每三位數用 "," 隔開
P百分比{0:P}0.2525.00%Percent:輸入數值*100 ; 預設取小數2位,P0可取小數
R來回{0:R}0.250.25Round-trip:只支援Double、Single
X十六進位{0:R}1237BHexadecimal:只支援整數資料型別(integral types)

補充一下:這部分比較特別是貨幣會應系統語系會有差異,若要特定語系的顯示就要設定一下,應該大部分會用英文與系為主吧 XD

自訂數值格式

格式說明FormatInputOutput補充
0零值預留位置{0:000.000}12.3012.300Zero placeholder
#數字預留位置{0:###.###}12.312.3Digit placeholder 
#,,:1234567890→1235
#,,,:1234567890→1
#,##0,,:1234567890→1,235
.小數點{0:0.0}12.312.3Decimal point
,千位分隔符號{0:0,0}12001,200Thousand separator and number scaling
%百分比預留位置{0:0%}0.2525% Percentage placeholder
e科學標記法{0:0e+0}1231e+2Scientific notation
\跳脫字元{0:00\n0}12312 3 Escape character

備註:自訂數值格式化:{0:(###) ### – ####} ,1234567890→(123) 456 – 7890

標準DateTime格式

測試時間:2012/3/11 下午 01:02

格式說明FormatOutput補充
d簡短日期{0:d}2012/3/11MM/dd/yyyy
D完整日期{0:D}2012年3月11日 
f完整可排序日期/時間{0:f}2012年3月11日 下午 01:02 
F完整可排序日期/時間{0:F}2012年3月11日 下午 01:02:03 
g一般可排序日期/時間{0:g}2012/3/11 下午 01:02 
G一般可排序日期/時間{0:G}2012/3/11 下午 01:02:03 
M、m月日{0:m}3月11日 
o來回日期/時間{0:o}2012-03-11T13:02:03.0000000 
R、rRFC1123{0:R}Sun, 11 Mar 2012 13:02:03 GMT 
s可排序日期/時間{0:s}2012-03-11T13:02:03 
t簡短時間{0:t}下午 01:02HH:mm
T完整時間{0:T}下午 01:02:03HH:mm:ss
u通用可排序日期/時間{0:u}2012-03-11 13:02:03Zyyyy'-'MM'-'dd HH':'mm':'ss'Z'
U通用可排序日期/時間{0:U}2012年3月11日 上午 05:02:03 
Y、y年月{0:y}2012年3月 

備註:輸出日期格式顯示可以依據〈控制台〉→ 〈地區語言選項〉做修改

詳細請參考:黑暗執行緒大大的 String.Format yyyy/MM/dd? 誤會大了

自訂DateTime格式

測試時間:2012/3/11 下午 02:21

格式說明FormatOutput補充
dd月份日期{0:dd}11 
ddd星期幾的縮寫{0:ddd}星期日Sun
dddd星期幾的完整名稱{0:dddd}星期日Sunday
f, ff…秒數{0:fff}364 
gg,…時期或時代{0:gg}西元 
hh小時(12 小時制){0:hh}02 
HH小時(24 小時制){0:HH}14 
mm分鐘{0:mm}21 
MM月份{0:MM}03 
MMM月份的縮寫名稱{0:MMM}三月Mar
MMMM月份的完整名稱{0:MMMM}三月March
ss秒數{0:ss}49 
ttA.M./P.M{0:tt}下午 
yy兩個位數的數字來表示年份{0:yy}12 
yyy三個位數的數字來表示年份{0:yyy}2012 
yyyy四個位數的數字來表示年份{0:yyyy}2012 
zz時差(小時){0:zz}+08系統時區與格林威治標準時間 (GMT) 時差
zzz時差(小時&分鐘){0:zzz}+08:00系統時區與格林威治標準時間 (GMT) 時差 (帶正負號)
:時間分隔符號{0:hh:mm:ss}02:29:06 
/日期分隔符號{0:yyyy/MM/dd}2012/03/11 

詳細請參考 自訂DateTime格式字串