Возьмите следующий параметр в качестве ширины поля в String.Format - PullRequest
5 голосов
/ 23 февраля 2010

В C # у меня есть ширина, которую я хочу использовать для некоторых строк, но я не буду знать эту ширину до времени выполнения. Я делаю что-то вроде этого:

string.Format("{0, " + digits + "}", value)  // prints 123 as "  123"

Есть ли директива форматирования строки, которая позволяет мне указать это, не разбивая мою собственную строку формата вместе, как это?

Я какое-то время оглядывался по MSDN и чувствую, что мне не хватает целой главы о строках формата или что-то в этом роде.

Ответы [ 8 ]

7 голосов
/ 23 февраля 2010

Взгляните на PadLeft:

s = "123".PadLeft(5);  // Defaults to spaces
s = "123".PadLeft(5, '.');  // Pads with dots
2 голосов
/ 23 февраля 2010

Вы можете использовать методы PadLeft и PadRight:

http://msdn.microsoft.com/en-us/library/system.string.padleft%28VS.71%29.aspx

2 голосов
/ 23 февраля 2010

вы можете сделать что-то вроде

string test = valueString.PadLeft(10,' ');

или даже глупее

string spaces = String.Concat(Enumerable.Repeat(" ", digits).ToArray());
1 голос
/ 23 февраля 2010

Функции, упомянутые другими, будут работать, но эта страница MSDN имеет более общее решение для форматирования, которое изменяется во время выполнения:

Составное форматирование

Они приводят примеры, очень похожие на ваши.

Редактировать: Я думал, что вы пытаетесь решить общий случай составления строки формата во время выполнения. Например, если не было встроенного PadLeft (), вы можете сделать это:

    int myInt = 123;
    int nColumnWidth = 10;

    string fmt = string.Format("Price = |{{0,{0}}}|", nColumnWidth);

    // now fmt = "Price = |{0,5}|"

    string s = string.Format(fmt, myInt);

Вы можете сделать все это в одной строке, но это ужасно:

    string s = string.Format(
            string.Format("Price = |{{0,{0}}}|", nColumnWidth),
            myInt);
0 голосов
/ 26 апреля 2016

String имеет конструктор, который создает строку с данным символом, повторяемым n раз.

https://msdn.microsoft.com/en-us/library/xsa4321w(v=vs.110).aspx

// prints 123 as "  123"
string.Format(new string(' ', digits) + "{0}", value)
0 голосов
/ 14 июня 2012

Я опубликовал статью CodeProject, которая может быть тем, что вы хотите.

См .: Способ C # для косвенного форматирования ширины и стиля.

По сути, это метод FormatEx, который действует как String.Format, за исключением того, что он допускает косвенное выравнивание и спецификаторы formatString.

FormatEx("{0,{1}:{2}}", value, width, formatString);

Означает форматирование значения varArgs 0 в ширине поля, указанной в varArgs 1, с использованием кода formattingString, указанного в varArgs 2.

Редактировать: Внутренне, он делает то, что многие другие предложили в своих ответах. Я только что обернул синтаксический анализ и определение окончательных значений для выравнивания и formatString. Я также добавил модификатор «выравнивание по центру».

-Jesse

0 голосов
/ 23 февраля 2010

Возможно, излишнее, но просто для иллюстрации способа инкапсуляции спецификации формата и использования перегрузки String.Format, которая принимает IFormatProvider.

class Program
{
    public static void Main(string[] args)
    {
        int digits = 7;
        var format = new PaddedNumberFormatInfo(digits);
        Console.WriteLine(String.Format(format, "{0}", 123));
    }
}
class PaddedNumberFormatInfo : IFormatProvider, ICustomFormatter
{
    public PaddedNumberFormatInfo(int digits)
    {
        this.DigitsCount = digits;
    }

    public int DigitsCount { get; set; }

    // IFormatProvider Members
    public object GetFormat(Type formatType)
    {
        if (formatType == typeof(ICustomFormatter))
            return this;

        return null;
    }
    // ICustomFormatter Members
    public string Format(string format, object arg, IFormatProvider provider)
    {
        return String.Format(
            String.Concat("{0, ", this.DigitsCount, "}"), arg);
    }
}
0 голосов
/ 23 февраля 2010

Возможно, это поможет с вашими исследованиями по форматированию:

Типы форматирования
Составное форматирование

Однако я не думаю, что у вас получится намного лучше, поскольку этот параметр выравнивания должен быть частью строки формата и, по-видимому, не представлен свойством.

...