点滴拾遗 - 自定义 Format 控制 String.Format 行为

点击下载示例代码

String.Format 一重载方法的签名如下

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

可以通过自定义 IFormatProvider 接口来控制 String.Format 执行过程中的特定行为。

 

过程如下

1, 自定义类实现 IFormatProvider 接口(object GetFormat 方法)

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 方法)

摘自 MSDN。功能为控制 Int64 type 的string输出。

 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);

 

执行结果如下

 

参考资料

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

posted on 2015-08-05 02:18  iSun  阅读(729)  评论(0编辑  收藏  举报