Laden...

String auf Console gleichmässig tabellarisch formattieren

Erstellt von AnSc vor 6 Jahren Letzter Beitrag vor 6 Jahren 3.296 Views
A
AnSc Themenstarter:in
7 Beiträge seit 2017
vor 6 Jahren
String auf Console gleichmässig tabellarisch formattieren

Hallo Ihr,

als Neueinsteiger im Programmieren stoße ich natürlich regelmäßig auf Schwierigkeiten. In aller Regel kann ich jedoch durch Nachlesen die meisten Probleme gut beheben. Nun bin ich allerdings auf ein Problem gestoßen, welches mich seit einigen Stunden beschäftigt. Ich bin mir sicher, dass es für Euch kein Problem darstellt, insofern ich einigermaßen vermitteln kann, um was es geht.

Undzwar ist es so, dass ich derzeit ein Programm programmiere, welches eine Roulette-Simulation bzw. Setztaktiken simuliert. Hierbei ist es möglich die Setzfarbe als String zu wählen "rot" oder "schwarz".
Wenn ich meinen Code so formatier, dass er bei String "rot" eine schöne Ausgabe erzeugt ist es so, dass er alles völlig verzieht, sobald ich auf schwarz ändere. Ich geh mal stark davon aus, dass es an den zusätzlichen Buchstaben liegt. Wie man Zahlen formatiert, weiß ich bereits. Leider habe ich keine Ahnung wie man dies mit einem String so macht, dass es ordentlich funktioniert.

Hier noch die vermeindliche Stelle im Code:


do
                {
                    zahl = zufall.Next(0, 37); 
                    Console.Write("Einsatz: {0,3} auf {1,5}.   Gefallen ist: {2,2},  ", einsatz, meineFarbe, zahl);
                    if (zahl == 0)
                    {
                        Console.ForegroundColor = ConsoleColor.Green;
                        farbe = "grün";
                        Console.Write("{0}   ", farbe);
                        Console.ResetColor();

Zur besseren Übersicht habe ich euch noch einen Screenshot gemacht.

16.835 Beiträge seit 2008
vor 6 Jahren

Könntest Du ein wenig Code dazu zeigen, sodass man hier evtl. den Fehler erkennen kann?

A
AnSc Themenstarter:in
7 Beiträge seit 2017
vor 6 Jahren

Hallo,

hab oben die vermeindliche Stelle hinzugefügt (hatte ich vergessen, sorry).
Die Option Farbe zu wählen ist unter der Variable "meineFarbe" verbucht.

K
166 Beiträge seit 2008
vor 6 Jahren

Hey,

Probier mal

Console.Write("{0}\t", farbe);

LG Killerkruemel

A
AnSc Themenstarter:in
7 Beiträge seit 2017
vor 6 Jahren

Danke für den Vorschlag. Löst leider mein Problem noch nicht.

Ich füge hier noch ein wenig Code hinzu, vielleicht wird das Problem dann deutlicher.

Das Problem ist hierbei, wenn ich die Variable "meineFarbe" von rot auf schwarz ändere, verschiebt es mir eben den Code genau um die zusätzlichen Buchstaben nach rechts. In diesem Fall dürfte das Problem ja bei dem Platzhalter unten "auf {1}" liegen, oder?


do
                {
                    zahl = zufall.Next(0, 37); //Fallunterscheidung in Farbe
                    Console.Write("Einsatz: {0,3} auf {1}  Gefallen ist: {2,2},  ", einsatz, meineFarbe, zahl);
                    if (zahl == 0)
                    {
                        Console.ForegroundColor = ConsoleColor.Green;
                        farbe = "grün";
                        Console.Write("{0}   ", farbe);
                        Console.ResetColor();

                    }
                    else if (zahl % 2 == 0)
                    {
                        Console.ForegroundColor = ConsoleColor.White;
                        farbe = "schwarz";
                        Console.Write("{0} ", farbe);
                        Console.ResetColor();
                    }
                    else
                    {
                        Console.ForegroundColor = ConsoleColor.Red;
                        farbe = "rot";
                        Console.Write("{0}   ", farbe);
                        Console.ResetColor();
                    }

1.040 Beiträge seit 2007
vor 6 Jahren

(Du kannst deinen Code mit dem C#-Symbol über dem Beitragsfeld übrigens formatieren. =)){gray}

A
AnSc Themenstarter:in
7 Beiträge seit 2017
vor 6 Jahren

Danke. 😉 Mit dem Formatieren hab ichs scheinbar nicht so. 😃

185 Beiträge seit 2005
vor 6 Jahren

Du kannst ja einfach mit PadLeft oder PadRight die Länge deiner Ausgaben festlegen.


meineFarbe.PadLeft(10," ")

edit: meineFarbe ist richtig 😃

C
2.121 Beiträge seit 2010
vor 6 Jahren

Der Text schwarz ist länger als rot, daher verschiebts dir alles. Auch wenn Tabs drin sind, irgendwann wirds eben zu breit und dann wird das nächte Tab angesprungen.
Eine Lösung kann sein, immer Text in der selben Breite zu schreiben. Das heißt such dir die Maximalbreite heraus und hänge so viele Leerzeichen an den Text an, dass alles gleich breit wird.

So wie du das gerade machst brauchst du kein {0}, da könntest du gleich die Farbe reinschreiben. Zieh die gemeinsamen Stellen aus den if Blöcken raus.

A
AnSc Themenstarter:in
7 Beiträge seit 2017
vor 6 Jahren

Vielen Dank für die Information.

Das mit den zusätzlichen Leerzeichen zur Ergänzung der fehlenden Buchstaben funktioniert super.

Versteh ich das dann also richtig, dass es keinen Platzhalter gibt, der z.B 8 Stellen freihält um das Format unabhängig von der Eingabe beibehält?

4.939 Beiträge seit 2008
vor 6 Jahren

Hallo,

bei


Console.Write("Einsatz: {0,3} auf {1,5}.   Gefallen ist: {2,2},  ", einsatz, meineFarbe, zahl);

hast du doch auch schon die Mindestlänge angegeben.
Warum nutzt du das dann nicht bei der Ausgabe der Farbe? Oder wußtest du nicht, was die Zahl hinter dem Komma bedeutet?

A
AnSc Themenstarter:in
7 Beiträge seit 2017
vor 6 Jahren

Hallo,

scheinbar nicht. Ich bin immer (mach das ja erst kurz. 😛) davon ausgegangen, dass es sich hierbei um eine Möglichkeit zum verschieben handelt.
Heißt das, wenn ich jetzt z.B ("{0,9} bla bla", variable) schreibe, dass ich hier einen Platzhalter habe, der min. 9 Stellen annimmt? Sollte ich z.B schwarz als variable übergeben, ist es ja aber dann nicht so, dass die übrigen Stellen (2) als leerzeichen interpretiert werden, oder?

2.079 Beiträge seit 2012
vor 6 Jahren

Du kannst dir das auch mal hier nachlesen: C# String Format - Dot Net Perls
Denn nichts anderes tut Console.WriteLine, wie Du es nutzt.

Wenn Du schreibst:

var s = "123";
Console.WriteLine("<{0,5}>", s);
Console.WriteLine("<{0,-5}>", s);

Damit bekommst Du folgende Ausgabe:

<  123>
<123  >

Da sind jeweils zwei Leerzeichen vor bzw. nach dem 123.

Mit der Zahl nach dem Komma gibst Du also indirekt die Mindest-Länge von dem einzufügenden String an.
Wenn der tatsächliche String kürzer ist, wird der Platz mit Leerzeichen aufgefüllt.
Wenn die Zahl negativ ist, werden die Leerzeichen nach dem einzufügenden String ergänzt, ist sie positiv, landen die Leerzeichen davor.

Übrigens:
Wenn Du komplexe Strings zusammen bastelst, dann hilft String Interpolation sehr dabei, die Übersicht zu behalten.

Mein Beispiel sähe dann so aus:

var s = "123";
Console.WriteLine($"<{s,5}>");
Console.WriteLine($"<{s,-5}>");

Wenn Du einen Text in der Console "verschieben" willst, dann kannst Du entweder die Cursor-Position per Hand setzen, oder Du schreibst Leerzeichen vor deinen String.

Variante mit der Cursor-Position:

var s = "123";

Console.SetCursorPosition(5, 0);
Console.WriteLine(s);

Console.SetCursorPosition(10, 1);
Console.WriteLine(s);

Console.SetCursorPosition(15, 2);
Console.WriteLine(s);

Und die Leerzeichen einfügen:

var s = "123";

Console.WriteLine(new string(' ', 5) + s);
Console.WriteLine(new string(' ', 10) + s);
Console.WriteLine(new string(' ', 15) + s);

Beides produziert die selbe Ausgabe:

     123
          123
               123

Ich persönlich mag die zweite Varainte aber lieber.

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

A
AnSc Themenstarter:in
7 Beiträge seit 2017
vor 6 Jahren

recht herzlichen Dank für die ausführliche Antwort! 😉 Hat mir sehr weitergeholfen.

Schönes Restwochenende wünsch ich! 😉

Beste Grüße

57 Beiträge seit 2012
vor 6 Jahren

Du musst in der Ausgabe der Farbe eine Länge angeben, bspw. 10:
Console.WriteLine("... {0,10}...", variable)

OO gibts seit Platon - hatte der auch C#?