Zahl durch FORMAT ausgeben

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von Lammi.

    Zahl durch FORMAT ausgeben

    Ich fülle mehrere Label aktuell wie folgt:

    xxx.Text = CStr(Format(hugo1, "0")) & " / " & CStr(Format(hugo2, "0"))

    Sieht dann am Bildschirm schön mittig zentriert aus:

    7 / 9
    0 / 3
    2 / 4

    Nun möchte ich aber 0-Werte nicht angezeigt bekommen. Eine Definition mit "#" macht jedoch keinen Sinn, da das Feld ansonsten als "leer" angesehen wird und sich die Ausgabe optisch nach links verschiebt.

    7 / 9
    / 3
    2 / 4

    Als Anfänger denkt man dann an eine in der Farbe des Hintergrunds ausgegebene (und somit nicht sichtbare) 0. Wahrscheinlich nicht stylisch.

    Wäre dankbar, wenn jemand eine andere Idee hat. Danke vorab!
    @Lammi Dein VB6-Format gibt bereits einen String zurück.
    .NET-formatiert sieht es so aus:

    VB.NET-Quellcode

    1. xxx.Text = Stfring.Format("{0} / {1}", hugo1.ToString("0").Replace("0", " "), hugo2)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Dankeschön ...

    Sorry, ich hatte meine Anfrage jetzt etwas verkürzt formuliert, was leider die Lösung etwas verfälscht.

    Denn korrekt wären auch 4-stellige Zahlen möglich. Daher sehe ich den FORMAT als zwingend an, da ich auch 1.000er-Punkte ausgeben wollte.
    Aber es kann halt auch eine reine "0" dort stehen.

    Koorekt sieht es aktuell also so bei mir aus:
    xxx.Text = CStr(Format(hugo1, "#.##0")) & " / " & CStr(Format(hugo2, "#.##0"))
    @Lammi .NET-formatiert sieht es so aus:
    xxx.Text = Stfring.Format("{0:#.##0} / {1:#.##0}", hugo1, hugo2)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hast du auch die C&P Bremse beachtet?
    Allerdings formatiert die Rod's Code die Null wieder und du willst ja Leerstellen. Aber den Code verstehen wirst du schon müssen...
    Ich habe auch etwas gespielt, wird dir aber wohl auch ohne C&P-Bremse zuviel sein.

    VB.NET-Quellcode

    1. Dim val1 As String = If(hugo1 > 0, $"{hugo1,9:#.##0}", " ")
    2. Dim val2 As String = If(hugo2 > 0, $"{hugo2,9:#.##0}", "")
    3. xxx.Text = $"{val1} / {val2}{Environment.NewLine}"

    Dksksm schrieb:

    Hast du auch die C&P Bremse beachtet?
    Allerdings formatiert die Rod's Code die Null wieder und du willst ja Leerstellen. Aber den Code verstehen wirst du schon müssen...
    Ich habe auch etwas gespielt, wird dir aber wohl auch ohne C&P-Bremse zuviel sein.



    Hmm ... also ich habe mit den ganzen Codezeilen schon fleißig getestet und geübt.
    Allerdings - so sehe ich es - ist da bisher nicht die idee dabei, die ich suche.

    Deinen Vorschlag verstehe ich. Aber "nur" um die eine "0" in ein Leerzeichen umzuwandeln, wollte ich daraus nicht 3 Zeilen machen.
    Sorry, aber ich hate die Hoffnung, dass es mit einer leichten Modifikation meiner Zeile möglich ist.
    Die Ideen hier sind alle sehr nett.
    geht auch in einer

    VB.NET-Quellcode

    1. xxx.Text = $"{If(hugo1 > 0, $"{hugo1,9:#.##0}", " ")} / {If(hugo2 > 0, $"{hugo2,9:#.##0}", "")}{Environment.NewLine}"


    Da du keine neue Zeile brauchst geht auch

    VB.NET-Quellcode

    1. xxx.Text = $"{If(hugo1 > 0, $"{hugo1,9:#.##0}", " ")} / {If(hugo2 > 0, $"{hugo2,9:#.##0}", "")}"

    Lammi schrieb:

    aber mein Visual Studio 2019 mag die Syntax so nicht.
    Was sagt denn Dein Studio 2019?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Sieht leider nicht gut aus.

    Ein bisheriger EIntrag
    1 / 0

    wird zwar jetzt angezeigt als
    1 /

    aber dafür sind vor der 1 drei oder vier Leerzeichen. Heißt, das ganze ist nicht mehr zentriert sondern verschiebt sich sehr unschön nach rechts.

    Angepasst habe im Code aus 2 x #.##0 wurde 2 x #,##0
    Und das abschließende "" habe ich um ein Leerzeichen erweitert in " "
    @Lammi
    Ich nehme an, das auf beiden Seiten des / gleich viele Zeichen stehen sollen, damit es zentriert wird. (also auch bei 9 / 100 oder 100/)
    Dann würde ich wohl so etwas machen:
    - hugo1 formatieren .ToString("#,0") (Das Tausender-Trennzeichen wird mit , erzeugt, das . ist für das Dezimaltrennzeichen)
    - Falls vorhanden, die Null am Anfang entfernen .TrimStart("0"c)
    - Den String hugo1 an die Länge von hugo2 anpassen .PadLeft(hugo2.ToString("#,0").Length, " "c)
    - das gleiche für hugo2 machen

    VB.NET-Quellcode

    1. Dim str1 As String = hugo1.ToString("#,0").TrimStart("0"c).PadLeft(hugo2.ToString("#,0").Length, " "c)
    2. Dim str2 As String = hugo2.ToString("#,0").TrimStart("0"c).PadLeft(str1.Length, " "c)
    3. xxx.Text = String.Format("{0} / {1}", str1, str2)

    Als Einzeiler:

    VB.NET-Quellcode

    1. xxx.Text = String.Format("{0} / {1}", hugo1.ToString("#,0").TrimStart("0"c).PadLeft(hugo2.ToString("#,0").Length, " "c), hugo2.ToString("#,0").TrimStart("0"c).PadLeft(hugo1.ToString("#,0").Length, " "c))


    Zusätzlich schau dir einmal die Microsoft Dokumentation zu "Formatieren von Strings" an ->
    - Formatieren von Typen in .NET
    - Interpolierte Zeichenfolgen (Visual Basic Referenz)
    Dann laß halt die IF-Abfrage für den 2. Wert weg. Da sist alles kein Hexenwerk, ein bischen mit String.Format sollte man sich schon auseinandersetzen

    VB.NET-Quellcode

    1. xxx.Text = $"{If(hugo1 > 0, $"{hugo1,9:#.##0}", " ")} / {hugo2,9:#.##0}"


    Was @RodFromGermany dir gezeigt hat ist die "ältere" Schreibweise / Variante. Ich benutze ledigleich eine moderne Fassung von String.Format. Aber ob du etwas linksbündig, rechtbündig, viele Zeichen etc. anzeigen lassen willst, das musst du dir vielleicht auch einfach selbst ergooglen. Mit String.Format kannst du dir unter Verwendung eines entsprechenden Zeichensatzes jede beliebeige "Bündigkeit" zusammenbasteln.