你的位置:首页 > ASP.net教程

[ASP.net教程]点滴拾遗


点击下载示例代码

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