码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-08-05 06:30:33      阅读:114      评论:0      收藏:0      [点我收藏+]

标签:

点击下载示例代码

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

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

标签:

原文地址:http://www.cnblogs.com/isun/p/4703605.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!