Как я могу выровнять текст в Столбцах с помощью консоли.Метода 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);
}


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

713   7  

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

это может выглядеть более сложным, чем чистый 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]);
}

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

Comments

    Ничего не найдено.