サポートを維持する拡張メソッドを作成しようとしました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);
}
}
}
注: 奇数個のスペース文字を追加する必要がある場合に、1 つの「余分な」スペース文字を左または右に配置するかどうかを指定していません。
このテストは、それが機能することを示しているようです:
double theObject = Math.PI;
string test = string.Format("Now '{0:F4}' is used.", theObject.Center(10));
もちろん、「小数点以下4桁に丸める」F4
という意味を持つフォーマット文字列。double