6

我有一个字符串(如下所示),我希望每个参数都居中对齐。

有一个左对齐选项是(“+”)和右对齐是(“-”),但我想居中对齐。

basketItemPrice = string.Format("\n\n{0, -5}{1, -14:0.00}{2, -18:0.00}{3,-14:0.00}{4,6}{5,-12:0.00}", item.Quantity, item.OrderItemPrice, item.MiscellaniousCharges, item.DiscountAmountTotal, "=", item.UpdateItemAmount(Program.currOrder.OrderType));
4

4 回答 4

14

不幸的是,这不被String.Format. 您必须自己填充字符串:

static string centeredString(string s, int width)
{
    if (s.Length >= width)
    {
        return s;
    }

    int leftPadding = (width - s.Length) / 2;
    int rightPadding = width - s.Length - leftPadding;

    return new string(' ', leftPadding) + s + new string(' ', rightPadding);
}

使用示例:

Console.WriteLine(string.Format("|{0}|", centeredString("Hello", 10)));
Console.WriteLine(string.Format("|{0}|", centeredString("World!", 10)));
于 2013-09-02T12:23:16.623 回答
7

我试图制作一个仍然保留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));

当然,格式化字符串F4double意思是“四舍五入到小数点后 4 位”。

于 2013-09-02T13:04:43.777 回答
0

我不确定是否理解您的问题,但希望对您有所帮助:

public static class StringHelper
{
    public static string Center(this String value, int width)
    {
        var padding = (width + value.Length) / 2;
        return value.PadLeft(padding, '#');
    }
}
于 2013-09-02T13:30:06.227 回答
-3

如果要在位图上绘图,请使用 Graphics.DrawString(..) 方法并将字符串对齐设置为中心。

这里有很多例子:

http://msdn.microsoft.com/en-us/library/system.drawing.stringformat.linealignment.aspx

于 2013-09-02T12:30:45.403 回答