我试图制作一个仍然保留IFormattable
支持的扩展方法。它使用一个嵌套类来记住原始值和所需的宽度。然后,当提供格式字符串时,如果可能,将使用它。
它看起来像这样:
public static class MyExtensions
{
public static IFormattable Center<T>(this T self, int width)
{
return new CenterHelper<T>(self, width);
}
class CenterHelper<T> : IFormattable
{
readonly T value;
readonly int width;
internal CenterHelper(T value, int width)
{
this.value = value;
this.width = width;
}
public string ToString(string format, IFormatProvider formatProvider)
{
string basicString;
var formattable = value as IFormattable;
if (formattable != null)
basicString = formattable.ToString(format, formatProvider) ?? "";
else if (value != null)
basicString = value.ToString() ?? "";
else
basicString = "";
int numberOfMissingSpaces = width - basicString.Length;
if (numberOfMissingSpaces <= 0)
return basicString;
return basicString.PadLeft(width - numberOfMissingSpaces / 2).PadRight(width);
}
public override string ToString()
{
return ToString(null, null);
}
}
}
注意:在需要附加奇数个空格字符的情况下,您没有说明是否要将一个“额外”空格字符放在左侧或右侧。
该测试似乎表明它有效:
double theObject = Math.PI;
string test = string.Format("Now '{0:F4}' is used.", theObject.Center(10));
当然,格式化字符串F4
的double
意思是“四舍五入到小数点后 4 位”。