C # - Вставить переменное количество пробелов в строку? (Форматирование выходного файла) - PullRequest
51 голосов
/ 13 февраля 2011

Хорошо, я беру данные из списка, которым я заполняю DataGridView, и экспортирую их в текстовый файл. Я уже выполнил функцию для экспорта в CSV, и хотел бы также сделать текстовую версию.

Поскольку заголовки и другие элементы имеют переменную длину, когда файл сохраняется и затем открывается в блокноте, он выглядит как беспорядок, потому что ничего не выстраивается.

Я бы хотел, чтобы результат выглядел так:

Sample Title One   Element One   Whatever Else
Sample Title 2     Element 2     Whatever Else
S. T. 3            E3            Whatever Else

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

Мой главный вопрос: Есть ли элегантный способ добавить переменное число символов в строку? Было бы неплохо иметь что-то вроде: myString.insert(index, charToInsert, howManyToInsert);

Конечно, я, конечно, могу просто написать функцию, чтобы сделать это через цикл, но я хотел посмотреть, есть ли лучший способ сделать это.

Заранее спасибо!

-Sootah

Ответы [ 5 ]

100 голосов
/ 13 февраля 2011

Для этого вы, вероятно, хотите myString.PadRight(totalLength, charToInsert).

См. Метод String.PadRight (Int32) для получения дополнительной информации.

40 голосов
/ 13 февраля 2011

Используйте String.Format() или TextWriter.Format() (в зависимости от того, как вы действительно записываете в файл) и укажите ширину поля.

String.Format("{0,20}{1,15}{2,15}", "Sample Title One", "Element One", "Whatever Else");

Вы также можете указать ширину поля в интерполированных строках:

$"{"Sample Title One",20}{"Element One",15}{"Whatever Else",15}"

И чтобы вы знали, вы можете создать строку повторяющихся символов, используя соответствующий конструктор строк.

new String(' ', 20); // string of 20 spaces
3 голосов
/ 13 февраля 2011

Использование String.Format:

string title1 = "Sample Title One";
string element1 = "Element One";
string format = "{0,-20} {1,-10}";

string result = string.Format(format, title1, element1);
//or you can print to Console directly with
//Console.WriteLine(format, title1, element1);

В формате {0,-20} означает, что первый аргумент имеет фиксированную длину 20, а отрицательный знак гарантирует, что строка печатается слева направо.

2 голосов
/ 13 февраля 2011

Просто для удовольствия, вот функции, которые я написал, чтобы сделать это до того, как у меня появился бит .PadRight:

    public string insertSpacesAtEnd(string input, int longest)
    {
        string output = input;
        string spaces = "";
        int inputLength = input.Length;
        int numToInsert = longest - inputLength;

        for (int i = 0; i < numToInsert; i++)
        {
            spaces += " ";
        }

        output += spaces;

        return output;
    }

    public int findLongest(List<Results> theList)
    {
        int longest = 0;

        for (int i = 0; i < theList.Count; i++)
        {
            if (longest < theList[i].title.Length)
                longest = theList[i].title.Length;
        }
        return longest;
    }

    ////Usage////
    for (int i = 0; i < storageList.Count; i++)
    {
        output += insertSpacesAtEnd(storageList[i].title, longest + 5) +   storageList[i].rank.Trim() + "     " + storageList[i].term.Trim() + "         " + storageList[i].name + "\r\n";
    }
0 голосов
/ 05 марта 2019

Я согласен с Джастином, и на WhiteSpace CHAR можно ссылаться, используя ASCII-коды здесь Символ номер 32 представляет пробел, следовательно:

string.Empty.PadRight(totalLength, (char)32);

Альтернативный подход: Создайте все пробелы вручную в пользовательском методе и вызовите его:

private static string GetSpaces(int totalLength)
    {
        string result = string.Empty;
        for (int i = 0; i < totalLength; i++)
        {
            result += " ";
        }
        return result;
    }

И вызовите его в своем коде для создания пробелов: GetSpaces (14);

...