字串格式(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 格式整理
標準數值格式
格式 | 說明 | Format | Input | Output | 補充 |
C | 貨幣 | {0:C} | 1234.567 | NT$1,234.57 | Currency :C預設到小數2位…C1取小數一位,C3取小數三位… |
D | 十進位 | {0:D} | 1234 | 1234 | Decimal: 只支援整數資料型別(integral types),D後面數字表示指定的位數 |
E | 科學指數 | {0:E} | 1234 | 1.234000E+003 | Scientific |
F | 固定 | {0:F} | 1234.4567 | 1234.46 | Fixed-point |
G | 一般 | {0:G} | 1234.567 | 1234.57 | General |
N | 數字 | {0:N} | 120000 | 120,000.00 | Number:每三位數用 "," 隔開 |
P | 百分比 | {0:P} | 0.25 | 25.00% | Percent:輸入數值*100 ; 預設取小數2位,P0可取小數 |
R | 來回 | {0:R} | 0.25 | 0.25 | Round-trip:只支援Double、Single |
X | 十六進位 | {0:R} | 123 | 7B | Hexadecimal:只支援整數資料型別(integral types) |
補充一下:這部分比較特別是貨幣會應系統語系會有差異,若要特定語系的顯示就要設定一下,應該大部分會用英文與系為主吧 XD
自訂數值格式
格式 | 說明 | Format | Input | Output | 補充 |
0 | 零值預留位置 | {0:000.000} | 12.3 | 012.300 | Zero placeholder |
# | 數字預留位置 | {0:###.###} | 12.3 | 12.3 | Digit placeholder #,,:1234567890→1235 #,,,:1234567890→1 #,##0,,:1234567890→1,235 |
. | 小數點 | {0:0.0} | 12.3 | 12.3 | Decimal point |
, | 千位分隔符號 | {0:0,0} | 1200 | 1,200 | Thousand separator and number scaling |
% | 百分比預留位置 | {0:0%} | 0.25 | 25% | Percentage placeholder |
e | 科學標記法 | {0:0e+0} | 123 | 1e+2 | Scientific notation |
\ | 跳脫字元 | {0:00\n0} | 123 | 12 3 | Escape character |
備註:自訂數值格式化:{0:(###) ### – ####} ,1234567890→(123) 456 – 7890
標準DateTime格式
測試時間:2012/3/11 下午 01:02
格式 | 說明 | Format | Output | 補充 |
d | 簡短日期 | {0:d} | 2012/3/11 | MM/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、r | RFC1123 | {0:R} | Sun, 11 Mar 2012 13:02:03 GMT | |
s | 可排序日期/時間 | {0:s} | 2012-03-11T13:02:03 | |
t | 簡短時間 | {0:t} | 下午 01:02 | HH:mm |
T | 完整時間 | {0:T} | 下午 01:02:03 | HH:mm:ss |
u | 通用可排序日期/時間 | {0:u} | 2012-03-11 13:02:03Z | yyyy'-'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
格式 | 說明 | Format | Output | 補充 |
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 | |
tt | A.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格式字串