使用IFormattable接口为自定义类定义格式字符串

///

1<summary>   
2/// “点”类的定义。   
3/// </summary>

public class Point : System.IFormattable
{
///

1<summary>   
2/// 点类的横纵坐标。   
3/// </summary>

private int m_x,m_y;

///

1<summary>   
2/// 点类构造(参数为横纵坐标值)。   
3/// </summary>

///

1<param name="x"/>

///

1<param name="y"/>

public Point(int x,int y)
{
m_x = x;
m_y = y;
}

#region IFormattable 成员

///

1<summary>   
2/// 用于生成格式字符串的函数。   
3/// </summary>

///

1<param name="format"/>

格式字符串。
///

1<param name="formatProvider"/>

区域格式信息对象。
///

1<returns></returns>

public string ToString(string format, IFormatProvider formatProvider)
{
string retString;
try
{
//判断格式字符串。
switch(format.ToUpper())
{
case "G": //自定义的通用格式。
retString = string.Format(formatProvider,"({0},{1})",m_x,m_y);
//“点”对象的字符串格式为:“(十进制数字,十进制数字)”。
break;
case "S": //自定义的标准格式。
retString = string.Format(formatProvider,"<{0},{1}>",m_x,m_y);
//“点”对象的字符串格式为:“<十进制数字,十进制数字>”。
break;
default: //自定义的默认格式。
retString = string.Format(formatProvider,"({0:X},{1:X})",m_x,m_y);
//“点”对象的字符串格式为:“(十六进制数字,十六进制数字)”。
break;

}
}
catch(System.NullReferenceException)
{
//格式字符串为空,返回通用格式。
retString = string.Format(formatProvider,"({0},{1})",m_x,m_y);
}
return retString;
}

#endregion

}

///

1<summary>   
2/// Test 的摘要说明。   
3/// </summary>

public class Test
{
public static void Main()
{
//定义一个点。
Point p = new Point(13,10);
//打印默认格式的点。
Console.WriteLine("{0}",p);
//打印标准格式的点。
Console.WriteLine("{0:S}",p);

/*

  • 输出结果:(13,10)
  • <13,10>
    */
    }
    }

/*

  • 注意:如果不实现IFormattable接口也可以用string.Format这些方法打印自定义类的对象,但string.Format方法
  • 只是调用object.ToString方法将类名打印出来。下面是string.Format这些方法调用ToString的处理顺序:
  • 1.如果要格式化的对象的值是 null,则返回空字符串 ("")。
  • 2.如果要格式化的对象所属的类实现了 ICustomFormatter 接口,则调用 ICustomFormatter.Format 方法。
  • 3.如果前面的ICustomFormatter.Format 方法未调用,并且该类实现了 IFormattable 接口,则调用
  • IFormattable.ToString 方法。
  • 4.如果前面的步骤未格式化类型,则调用该类型的 ToString 方法(从 Object 类继承而来)。
  • 然而,只有实现了IFormattable或ICustomFormatter这些接口才能识别我们自己定义的格式字符串,打印出我
  • 们想要的结果。
    */
Published At
Categories with Web编程
Tagged with
comments powered by Disqus