c# titel Wie kann ich Text in Spalten mit Console.WriteLine ausrichten?




title tag länge (6)

Ich habe eine Art Spaltenanzeige, aber die beiden letzten Spalten scheinen nicht korrekt ausgerichtet zu sein. Dies ist der Code, den ich im Moment habe:

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

Ich bin ein Anfängerprogrammierer, also verstehe ich vielleicht nicht alle Ratschläge, aber wenn Sie irgendeinen Rat haben, würde es sehr geschätzt werden!


Ich mag die hier erwähnten Bibliotheken sehr, aber ich hatte eine Idee, die einfacher sein könnte, als nur aufzufüllen oder Tonnen von String-Manipulationen zu machen,

Sie könnten Ihren Cursor einfach manuell mit der maximalen Zeichenfolgenlänge Ihrer Daten festlegen. Hier ist ein Code, um die Idee zu bekommen (nicht getestet):

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

Sie können leicht extrapolieren, wenn Sie mehr Zeilen haben.


Anstatt zu versuchen, den Text manuell in Spalten mit beliebigen Leerzeichenfolgen auszurichten, sollten Sie tatsächliche Registerkarten (die \t Escape-Sequenz) in jede Ausgabezeichenfolge einbetten:

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

Nur um Royas Antwort hinzuzufügen. In c # 6.0 können Sie nun die String-Interpolation verwenden:

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

Dies kann tatsächlich eine Zeile ohne all die zusätzlichen Dollars sein, ich denke nur, dass es so ein bisschen einfacher zu lesen ist.

Und Sie können auch einen statischen Import auf System.Console verwenden, um dies zu tun:

using static System.Console;

WriteLine(/* write stuff */);

Ich weiß, sehr alter Thread, aber die vorgeschlagene Lösung war nicht vollautomatisch, wenn es längere Strings gibt.

Ich habe daher eine kleine Hilfsmethode erstellt, die es vollautomatisch macht. Übergeben Sie einfach eine Liste von String-Arrays, wobei jedes Array eine Linie und jedes Element im Array darstellt, also ein Element der Linie.

Die Methode kann folgendermaßen verwendet werden:

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

Die Hilfsmethode ist wie folgt:

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

Hoffe, das hilft jemandem. Die Quelle stammt von einem Beitrag in meinem Blog hier: http://dev.flauschig.ch/wordpress/?p=387


Es gibt mehrere NuGet-Pakete, die beim Formatieren helfen können. In einigen Fällen string.Format die Funktionen von string.Format aus, aber Sie sollten Spalten basierend auf dem Inhalt mindestens automatisch string.Format .

ConsoleTableExt

ConsoleTableExt ist eine einfache Bibliothek, mit der Tabellen formatiert werden können, einschließlich Tabellen ohne ConsoleTableExt . (Ein beliebteres Paket ConsoleTables scheint keine randlosen Tabellen zu unterstützen.) Hier ein Beispiel für das Formatieren einer Liste von Objekten mit Spalten, deren Größe sich nach ihrem Inhalt 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

Wenn Sie mehr Funktionen benötigen, können Sie jede Konsolenformatierung mit CsConsoleFormat . † Hier sehen Sie beispielsweise die Formatierung einer Liste von Objekten als Raster mit einer festen Spaltenbreite von 10, wie in den anderen Antworten mit 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)
                    })
                )
        ));

Es kann komplizierter aussehen als pure string.Format , aber jetzt kann es angepasst werden. Beispielsweise:

  • Wenn Sie Spalten basierend auf Inhalt AddColumns(10, 10, 10, 10, 10) möchten, ersetzen Sie AddColumns(10, 10, 10, 10, 10) durch AddColumns(-1, -1, -1, -1, -1) ( -1 ist eine Verknüpfung zu GridLength.Auto , Sie haben mehr GridLength.Auto , einschließlich Prozentsatz der Breite des Konsolenfensters.

  • Wenn Sie Zahlenspalten nach rechts ausrichten möchten, fügen { Align = Right } dem Initialisierer einer Zelle { Align = Right } .

  • Wenn Sie eine Spalte färben möchten, fügen Sie dem Initialisierer einer Zelle { Color = Yellow } .

  • Sie können Rahmenstile und mehr ändern.

† CsConsoleFormat wurde von mir entwickelt.


Versuche dies

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

Dabei steht die erste Zahl innerhalb der geschweiften Klammern für den Index und die zweite für die Ausrichtung. Das Vorzeichen der zweiten Zahl zeigt an, ob die Zeichenfolge links oder rechts ausgerichtet sein sollte. Verwenden Sie negative Zahlen für die linke Ausrichtung.

Oder sehen Sie sich http://msdn.microsoft.com/en-us/library/aa331875(v=vs.71).aspx





vertical-alignment