我们平时设置格式几乎都是通过string.format()实现的,但是.net框架只对基元类型(如int, double, long, char等数据类型)的格式进行了实现,所有的类和结构的格式都是通过默认的ToString()来实现,这时,如果我们想按照自身的意愿在控制台显示特定的输出就需要通过实现Iformattable借口来操作相应字符串的显示方式,下面是一个简单的Vector示例:
namespace chapter9
{
class Program
{
static void Main(string[] args)
{
Vector v1 = new Vector(12,5,9);
Vector v2 = new Vector(43.2, 54.2, 76.2);
Console.WriteLine("In IJK format\n 1 is {0, 20:IJK}, 2 is {1, 20:IJK}", v1, v2);
Console.WriteLine("In default format\n 1 is {0, 20}, 2 is {1, 20}", v1, v2);
Console.WriteLine("In VE format\n 1 is {0, 20:VE}, \n2 is {1, 20:VE}", v1, v2);
Console.WriteLine("Norms are:\n 1 is {0, 20:N}, 2 is {1, 20:N}", v1, v2);
Console.ReadLine();
}
}
struct Vector : IFormattable // 利用此接口设计Vector定制的输出格式
{
private double x, y, z;
public Vector(double x, double y, double z)
{
this.x = x;
this.y = y;
this.z = z;
}
public string ToString(string format, IFormatProvider formatProvider)
{
if (format == null) //入口检查
return ToString();
string formatUpper = format.ToUpper(); //统一字符串大小写
switch (formatUpper)
{
case "N":
return "|| " + Norm().ToString() + " ||";
case "VE":
return string.Format("({0:E}, {1:E}, {2:E})", x, y, z);
case "IJK":
// StringBuilder相对于string,可以减小对内存的消耗,并提高效率,它常用于需要对字符串进行具体操作
StringBuilder sb = new StringBuilder(x.ToString(), 30); // 参数1为X的字符串形式,参数2为该字符穿需占内存
sb.AppendFormat("i + ");
sb.AppendFormat(y.ToString());
sb.AppendFormat("j + ");
sb.AppendFormat(z.ToString());
sb.AppendFormat("k");
return sb.ToString();
default:
return ToString();
}
}
// 重载ToString(),保险起见
public override string ToString()
{
return "(" + x + ", " + y + ", " + z + ")";
}
public double Norm()
{
return x * x + y * y + z * z;
}
}
}
tips:
1,0009对应的格式代码 {0:0000}
2.StringBuilder类的主要方法:Append(),AppendFormat(),Insert(),Remove(),Replace(),ToString()