以下示例来源于C#高效编程。书上代码有点问题,自己整理了一下。
实现IFormattable.ToString(),并且允许客户程序提供自己的格式化选项(通过IFormatProvider实现)。
public class Customer : IFormattable
{
public Customer()
{
//
// TODO: Add constructor logic here
//
}
public string name
{
get;
set;
}
public decimal Revenue
{
get;
set;
}
public string ContractPhone
{
get;
set;
}
public override string ToString()
{
return name;
}
public string ToString
(string format,IFormatProvider formatProvider)
{
if (formatProvider != null)
{
ICustomFormatter fmt = formatProvider.GetFormat(typeof(ICustomFormatter)) as ICustomFormatter;
if (fmt != null)
return fmt.Format(format, this, formatProvider);
}
switch (format)
{
case "r":
return Revenue.ToString();
case "p":
return ContractPhone;
case "nr":
return string.Format("{0,20},{1,10:C}",name,Revenue);
default :
return name;
}
}
}
//实现IFormatProvider,ICustomFormatter接口
public class CustomFormatter : IFormatProvider
{
public object GetFormat(Type formatType)
{
if (formatType == typeof(ICustomFormatter))
{
return new CustomFormatProvider();
}
return null;
}
//nested class
private class CustomFormatProvider : ICustomFormatter
{
public string Format(string format,object arg,IFormatProvider formatProvider)
{
Customer c = arg as Customer;
if (c == null)
{
return arg.ToString();
}
return string.Format("{0,50},{1,50},{2,50:C}",c.name,c.ContractPhone,c.Revenue);
}
}
}
//下面是使用的代码:
Customer c = new Customer();
c.name = "amyamyamyamyamyamyamyamyamyamyamyamyamyamyamy123456789";
c.Revenue = 987654321123456789;
c.ContractPhone = "sss";
CustomFormatter c_toStringFormat = new CustomFormatter();
Response.Write(c.ToString("nr", null));
Response.Write(c.ToString("", c_toStringFormat));