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