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

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

Ответ 1

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

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

Ответ 2

Попробуйте это

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=vs.71).aspx

Ответ 3

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

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

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

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

using static System.Console;

WriteLine(/* write stuff */);

Ответ 4

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

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

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

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

Ответ 5

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