Как выровнять текст в Столбцах с помощью консоли.Метода WriteLine?

У меня есть своего рода отображение столбца, но конец двух столбцов, похоже, не выравнивается правильно. Это код у меня есть на данный момент:

Console.WriteLine("Customer name    " 
    + "sales          " 
    + "fee to be paid    " 
    + "70% value       " 
    + "30% value");
for (int DisplayPos = 0; DisplayPos < LineNum; DisplayPos = DisplayPos + 1)
{
    seventy_percent_value = ((fee_payable[DisplayPos] / 10.0) * 7);
    thirty_percent_value = ((fee_payable[DisplayPos] / 10.0) * 3);          
    Console.WriteLine(customer[DisplayPos] + "         " 
        + sales_figures[DisplayPos] + "               " 
        + fee_payable[DisplayPos] + "           " 
        + seventy_percent_value + "           " 
        + thirty_percent_value);
}

Я новичок программист, поэтому я не могу понять все давали советы, но если у вас есть какие-либо советы буду признателен!

7 ответов


вместо того, чтобы пытаться вручную выровнять текст по столбцам с произвольными строками пробелов, вы должны встроить фактические вкладки (\t escape-последовательности) в каждую выходную строку:

Console.WriteLine("Customer name" + "\t"
    + "sales" + "\t" 
    + "fee to be paid" + "\t" 
    + "70% value" + "\t" 
    + "30% value");
for (int DisplayPos = 0; DisplayPos < LineNum; DisplayPos++)
{
    seventy_percent_value = ((fee_payable[DisplayPos] / 10.0) * 7);
    thirty_percent_value = ((fee_payable[DisplayPos] / 10.0) * 3);          
    Console.WriteLine(customer[DisplayPos] + "\t" 
        + sales_figures[DisplayPos] + "\t" 
        + fee_payable + "\t\t"
        + seventy_percent_value + "\t\t" 
        + thirty_percent_value);
}

попробуй такое

Console.WriteLine("{0,10}{1,10}{2,10}{3,10}{4,10}",
  customer[DisplayPos],
  sales_figures[DisplayPos],
  fee_payable[DisplayPos], 
  seventy_percent_value,
  thirty_percent_value);

где первое число внутри фигурных скобок-это индекс, а второе-выравнивание. Знак второго числа указывает, должна ли строка быть выровнена влево или вправо. Используйте отрицательные числа для выравнивания влево.

или посмотреть http://msdn.microsoft.com/en-us/library/aa331875 (v=против 71).aspx


просто добавить к ответу Ройя. В c# 6.0 теперь вы можете использовать интерполяцию строк:

Console.WriteLine($"{customer[DisplayPos],10}" +
                  $"{salesFigures[DisplayPos],10}" +
                  $"{feePayable[DisplayPos],10}" +
                  $"{seventyPercentValue,10}" +
                  $"{thirtyPercentValue,10}");

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

и вы также можете использовать статический импорт в системе.Консоль, позволяющая это сделать:

using static System.Console;

WriteLine(/* write stuff */);

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

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

метод можно использовать следующим образом:

var lines = new List<string[]>();
lines.Add(new[] { "What", "Before", "After"});
lines.Add(new[] { "Name:", name1, name2});
lines.Add(new[] { "City:", city1, city2});
lines.Add(new[] { "Zip:", zip1, zip2});
lines.Add(new[] { "Street:", street1, street2});
var output = ConsoleUtility.PadElementsInLines(lines, 3);

вспомогательный метод выглядит следующим образом:

public static class ConsoleUtility
{
    /// <summary>
    /// Converts a List of string arrays to a string where each element in each line is correctly padded.
    /// Make sure that each array contains the same amount of elements!
    /// - Example without:
    /// Title Name Street
    /// Mr. Roman Sesamstreet
    /// Mrs. Claudia Abbey Road
    /// - Example with:
    /// Title   Name      Street
    /// Mr.     Roman     Sesamstreet
    /// Mrs.    Claudia   Abbey Road
    /// <param name="lines">List lines, where each line is an array of elements for that line.</param>
    /// <param name="padding">Additional padding between each element (default = 1)</param>
    /// </summary>
    public static string PadElementsInLines(List<string[]> lines, int padding = 1)
    {
        // Calculate maximum numbers for each element accross all lines
        var numElements = lines[0].Length;
        var maxValues = new int[numElements];
        for (int i = 0; i < numElements; i++)
        {
            maxValues[i] = lines.Max(x => x[i].Length) + padding;
        }
        var sb = new StringBuilder();
        // Build the output
        bool isFirst = true;
        foreach (var line in lines)
        {
            if (!isFirst)
            {
                sb.AppendLine();
            }
            isFirst = false;
            for (int i = 0; i < line.Length; i++)
            {
                var value = line[i];
                // Append the value with padding of the maximum length of any value for this element
                sb.Append(value.PadRight(maxValues[i]));
            }
        }
        return sb.ToString();
    }
}

надеюсь, это поможет кто-то. Источник из сообщения в моем блоге здесь:http://dev.flauschig.ch/wordpress/?p=387


вы можете использовать вкладки вместо пробелов между столбцами и / или установить максимальный размер столбца в строках формата ...


есть несколько пакетов NuGet, которые могут помочь с форматированием. В некоторых случаях возможности string.Format достаточно, но вы можете авторазмер столбцов в зависимости от содержимого, по крайней мере.

ConsoleTableExt

ConsoleTableExt - простая библиотека, которая позволяет форматировать таблицы, включая таблицы без линий сетки. (Более популярный пакет ConsoleTables похоже, не поддерживает таблицы без границ.) Вот пример форматирование списка объектов со столбцами, размер которых зависит от их содержимого:

ConsoleTableBuilder
    .From(orders
        .Select(o => new object[] {
            o.CustomerName,
            o.Sales,
            o.Fee,
            o.Value70,
            o.Value30
        })
        .ToList())
    .WithColumn(
        "Customer",
        "Sales",
        "Fee",
        "70% value",
        "30% value")
    .WithFormat(ConsoleTableBuilderFormat.Minimal)
    .WithOptions(new ConsoleTableBuilderOption { DividerString = "" })
    .ExportAndWriteLine();

CsConsoleFormat

Если вам нужно больше возможностей, чем любое форматирование консоли может быть достигнуто с CsConsoleFormat.† Например, вот форматирование списка объектов в виде сетки с фиксированной шириной столбца 10, как и в других ответах с использованием string.Format:

ConsoleRenderer.RenderDocument(
    new Document { Color = ConsoleColor.Gray }
        .AddChildren(
            new Grid { Stroke = LineThickness.None }
                .AddColumns(10, 10, 10, 10, 10)
                .AddChildren(
                    new Div("Customer"),
                    new Div("Sales"),
                    new Div("Fee"),
                    new Div("70% value"),
                    new Div("30% value"),
                    orders.Select(o => new object[] {
                        new Div().AddChildren(o.CustomerName),
                        new Div().AddChildren(o.Sales),
                        new Div().AddChildren(o.Fee),
                        new Div().AddChildren(o.Value70),
                        new Div().AddChildren(o.Value30)
                    })
                )
        ));

это может выглядеть более сложным, чем pure string.Format, но теперь его можно подгонять. Например:

  • если вы хотите автоматически изменять размер столбцов на основе содержимого, замените AddColumns(10, 10, 10, 10, 10) С AddColumns(-1, -1, -1, -1, -1) (-1 ярлык GridLength.Auto, у вас есть больше вариантов размера, включая процент ширины окна консоли).

  • если вы хотите выровнять столбцы чисел справа, добавьте { Align = Right } к инициализатору ячейки.

  • если вы хотите покрасить столбец, добавьте { Color = Yellow } к клетке инициализатор.

  • вы можете изменить стили границ и многое другое.

† CsConsoleFormat был разработан мной.


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

можно просто вручную установить курсор, используя максимальную длину строки данных. Вот код, чтобы получить идею (не тестируется):

var column1[] = {"test", "longer test", "etc"}
var column2[] = {"data", "more data", "etc"}
var offset = strings.OrderByDescending(s => s.Length).First().Length;
for (var i = 0; i < column.Length; i++) {
    Console.Write(column[i]);
    Console.CursorLeft = offset + 1;
    Console.WriteLine(column2[i]);
}

вы можете легко экстраполировать, если у вас больше строк.