首页 > 学院 > 开发设计 > 正文

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

2019-11-14 14:12:40
字体:
来源:转载
供稿:网友

点击下载示例代码

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

1 public static string Format(2     IFormatPRovider provider,3     string format,4     params Object[] args5 )

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

 

过程如下

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

1 public object GetFormat(Type formatType)2 {3     if (formatType == typeof(ICustomFormatter))4         return this;5     else6         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         try18         {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


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表