wake-up-neo.net

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

Ich habe eine Art Spaltenanzeige, aber die beiden letzten Spalten scheinen nicht richtig 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 Rookie-Programmierer, daher verstehe ich vielleicht nicht alle Ratschläge, aber wenn Sie irgendwelche Ratschläge haben, wäre ich sehr dankbar!

73
Stephen Smith

Anstatt zu versuchen, den Text manuell in Spalten mit beliebigen Leerzeichenfolgen auszurichten, sollten Sie die tatsächlichen Tabulatoren (die Escape-Sequenz \t) in die einzelnen Ausgabezeichenfolgen 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);
}
13
Cody Gray

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 ist die erste Zahl in den geschweiften Klammern der Index und die zweite die Ausrichtung. Das Zeichen der zweiten Zahl gibt an, ob die Zeichenfolge links oder rechts ausgerichtet sein soll. Verwenden Sie negative Zahlen für die linke Ausrichtung.

Oder schauen Sie unter __. http://msdn.Microsoft.com/de-de/library/aa331875(v=vs.71).aspx

270
royas

Nur um royas Antwort hinzuzufügen. In c # 6.0 können Sie jetzt 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, es macht es etwas einfacher, so zu lesen.

Sie können auch einen statischen Import für System.Console verwenden, um Folgendes zu ermöglichen:

using static System.Console;

WriteLine(/* write stuff */);
42
Daniel Hakimi

Ich weiß, sehr alter Thread, aber die vorgeschlagene Lösung war nicht vollständig automatisch, wenn längere Zeichenfolgen vorhanden sind.

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

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 lautet 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 Post in meinem Blog hier: http://dev.flauschig.ch/wordpress/?p=387

6
Roemer

Es gibt mehrere NuGet-Pakete, die bei der Formatierung helfen können. In einigen Fällen reichen die Möglichkeiten von string.Format aus, aber Sie möchten möglicherweise Spalten automatisch basierend auf Inhalt sortieren.

ConsoleTableExt

ConsoleTableExt ist eine einfache Bibliothek, die das Formatieren von Tabellen ermöglicht, einschließlich Tabellen ohne Rasterlinien. (Ein beliebteres Paket ConsoleTables scheint keine randlosen Tabellen zu unterstützen.) Hier ein Beispiel für das Formatieren einer Liste von Objekten mit Spaltengrößen basierend auf ihrem Inhalt:

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 als dies benötigen, können Sie mit CsConsoleFormat eine beliebige Konsolenformatierung erreichen. † Beispiel: Formatierung einer Liste von Objekten als Raster mit fester 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 sieht vielleicht komplizierter aus als reiner string.Format, kann aber jetzt angepasst werden. Zum Beispiel:

  • Wenn Sie Spalten basierend auf Inhalt automatisch in der Größe anpassen 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 weitere Größenoptionen, einschließlich des Prozentsatzes der Breite des Konsolenfensters).

  • Wenn Sie die Anzahl der Spalten nach rechts ausrichten möchten, fügen Sie { Align = Right } zum Initialisierer einer Zelle hinzu.

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

  • Sie können Rahmenstile und mehr ändern.

† CsConsoleFormat wurde von mir entwickelt.

2
Athari

Sie können Tabulatoren anstelle von Leerzeichen zwischen Spalten verwenden und/oder die maximale Größe für eine Spalte in Formatzeichenfolgen festlegen.

2
LaGrandMere

Ich mag die hier erwähnten Bibliotheken wirklich, aber ich hatte eine Idee, die einfacher sein könnte, als einfach nur zu polstern oder Tonnen von Saitenmanipulationen auszuführen

Sie können den Cursor einfach manuell mit der maximalen Zeichenfolgenlänge Ihrer Daten setzen. Hier ist etwas 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önnten leicht extrapolieren, wenn Sie mehr Zeilen haben.

0
Sauleil