如何设置字符串的多个参数以对齐中心?

时间:2013-09-02 12:13:24

标签: c#

我有一个像下面这样的字符串,我希望每个参数都对齐中心,我们有左边的选项是(+),右边是( - )

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));

但我想调整中心。

编辑: - 将每个文本的中心对齐到它所覆盖的空间...就像第一个参数需要5个空格并从左边绘制但是我希望它在中心对齐的中心绘制。

4 个答案:

答案 0 :(得分:7)

不幸的是,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)));

答案 1 :(得分:6)

我尝试制作一个仍然保留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表示“小数点后四舍五入小数”。

答案 2 :(得分:0)

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

public static class StringHelper
{
    public static string Center(this String value, int width)
    {
        var padding = (width + value.Length) / 2;
        return value.PadLeft(padding, '#');
    }
}

答案 3 :(得分:-2)

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

这里有很多例子:

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