点击下载示例代码
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
新闻热点
疑难解答