點滴拾遺 - 自定義 Format 控制 String.Format 行爲

點擊下載示例代碼less

String.Format 一重載方法的簽名以下ide

1 public static string Format(
2     IFormatProvider provider,
3     string format,
4     params Object[] args
5 )

能夠經過自定義 IFormatProvider 接口來控制 String.Format 執行過程當中的特定行爲。this

 

過程以下spa

1, 自定義類實現 IFormatProvider 接口(object GetFormat 方法)code

1 public object GetFormat(Type formatType)
2 {
3     if (formatType == typeof(ICustomFormatter))
4         return this;
5     else
6         return null;
7 }

 

2, 實現 ICustomFormatter 藉口(string Format 方法)orm

摘自 MSDN。功能爲控制 Int64 type 的string輸出。blog

 1 public string Format(string fmt, object arg, IFormatProvider formatProvider)
 2 {
 3     // Provide default formatting if arg is not an Int64. 
 4     if (arg.GetType() != typeof(Int64))
 5         try
 6         {
 7             return HandleOtherFormats(fmt, arg);
 8         }
 9         catch (FormatException e)
10         {
11             throw new FormatException(String.Format("The format of '{0}' is invalid.", fmt), e);
12         }
13 
14     // Provide default formatting for unsupported format strings. 
15     string ufmt = fmt.ToUpper(CultureInfo.InvariantCulture);
16     if (!(ufmt == "H" || ufmt == "I"))
17         try
18         {
19             return HandleOtherFormats(fmt, arg);
20         }
21         catch (FormatException e)
22         {
23             throw new FormatException(String.Format("The format of '{0}' is invalid.", fmt), e);
24         }
25 
26     // Convert argument to a string. 
27     string result = arg.ToString();
28 
29     // If account number is less than 12 characters, pad with leading zeroes. 
30     if (result.Length < ACCT_LENGTH)
31         result = result.PadLeft(ACCT_LENGTH, '0');
32     // If account number is more than 12 characters, truncate to 12 characters. 
33     if (result.Length > ACCT_LENGTH)
34         result = result.Substring(0, ACCT_LENGTH);
35 
36     if (ufmt == "I")                    // Integer-only format.  
37         return result;
38     // Add hyphens for H format specifier. 
39     else                                          // Hyphenated format. 
40         return result.Substring(0, 5) + "-" + result.Substring(5, 3) + "-" + result.Substring(8);
41 }

 

使用實現好的 Format 類接口

 1 long acctNumber;
 2 double balance;
 3 DaysOfWeek wday;
 4 string output;
 5 
 6 acctNumber = 104254567890;
 7 balance = 16.34;
 8 wday = DaysOfWeek.Monday;
 9 
10 output = String.Format((new AcctNumberFormat(),
11                        "On {2}, the balance of account {0:H} was {1:C2}.",
12                        acctNumber, balance, wday);
13 Console.WriteLine(output);

 

執行結果以下ip

 

參考資料ci

Culture invariant Decimal.TryParse()  http://stackoverflow.com/questions/23131414/culture-invariant-decimal-tryparse

What does IFormatProvider do?  http://stackoverflow.com/questions/506676/what-does-iformatprovider-do

IFormatProvider Interface  https://msdn.microsoft.com/en-us/library/system.iformatprovider.aspx

相關文章
相關標籤/搜索