Bei Text ausgabe (Win32) wird dahinter ein ")" angezeigt



  • Ich habe das Problem das wenn ich mit der Zahl vom Guthaben über 10.- komme und dann wieder darunter wird mir immer ein ) dahinter angezeigt. Ihr ist der Code:

    	char guthaben[24]; //Guthaben ausgabe
    	
    	sprintf(guthaben, "Guthaben: %5.2f", g);
    	hDC = GetDC(hWnd);
    
    	
    	TextOut(hDC, 0, 0, guthaben, strlen(guthaben));
    

    Und hier das Wird mir Angezeigt:

    Guthaben: 9.10)

    Wie kann ich das verhindern?
    Danke schon im voraus für die Antworten



  • @gabrielix29 sagte in Bei Text ausgabe (Win32) wird dahinter ein ")" angezeigt:

    char guthaben[24]; //Guthaben ausgabe

    sprintf(guthaben, "Guthaben: %5.2f", g);
    hDC = GetDC(hWnd);

    TextOut(hDC, 0, 0, guthaben, strlen(guthaben));

    bei mir gibts keine klammer.


  • Mod

    Da gehört offensichtlich noch mehr zu deinem Programm. Reduziere dein Programm so weit, dass die verbliebenen Zeilen gerade noch den Fehler enthalten, und sonst nichts. Wahrscheinlich findest du den Fehler dabei sogar von alleine, weil du irgendwann einen Block Code entfernen wirst, von dem du denkst, dass er nichts mit dem Problem zu tun hat, danach aber das Problem plötzlich weg ist. Dann weißt du, wo der Fehler wirklich ist.



  • @gabrielix29 sagte in Bei Text ausgabe (Win32) wird dahinter ein ")" angezeigt:

    wenn ich mit der Zahl vom Guthaben über 10.- komme und dann wieder darunter wird mir immer ein ) dahinter angezeigt

    Das was wie ")" aussieht ist keine Klammer sondern der Rechte Teil der "0" die vorher dort stand. TextOut überschreibt halt einfach Pixel, und zwar nur innerhalb des rechteckigen Bereichs den der String benötigt. Einstellige Zahlen sind im Durchschnitt schmäler als zweistellige und daher bleibt rechts dann ein Bereich unbenutzt der vorher verwendet wurde. Und da bleiben dann einfach die Pixel stehen die vorher dort standen.

    Wenn du stattdessen ExtTextOut verwendest kannst du das Rechteck angeben in das der Text geschrieben werden soll. Unverwendete Bereiche werden dann mit der Hintergrundfarbe ausgefüllt (je nach Einstellungen im DC). Damit wird dann gelöscht was auch immer vorher dort stand.


  • Mod

    Ok, das hatte ich jetzt nicht erwartet 😯

    Aber wenn wir schon bei Darstellungsformen sind, noch der obligatorische Hinweis: Fließkommazahlen sind von den Basisdatentypen der am wenigsten geeignete Typ zur Speicherung von diskreten Größen wie "Geld". Das Konzept einer Fließkommazahl möchte möglichst gut das Konzept eines kontinuierlichen Zahlenraums im Computer abbilden (und macht dafür anderswo Zugeständnisse), diskrete Größen wollen ganz bestimmte, feste Werte (und das ist gerade der Teil, wo die Fließkommazahlen Zugeständnisse machen).

    Schau:
    https://ideone.com/rj4haC

    Wenn du dich nicht tiefer mit dem Thema auseinander setzen möchtest (was hieße, einen fertigen Typ für Geld zu benutzen, oder selber einen zu entwickeln), dann sind die Ganzzahltypen (int, etc.) ein gute Kompromiss, wo du einfach sagst, du rechnest in Cent:
    https://ideone.com/wc7Sqh



  • @hustbaer Danke für den Hinweis das werde ich nachher einmal versuchen



  • @SeppJ sagte in Bei Text ausgabe (Win32) wird dahinter ein ")" angezeigt:

    du rechnest in Cent

    Bzw. wenn du dich gleich auf Buchhaltungsquargel und andere Währungen vorbereiten willst, nimm Faktor 10000 oder mehr (100000). Also 10000 = 1 EUR/USD/...

    Für nen Colaautomaten tut's aber vermutlich wenn du Cent nimmst 🙂



  • ps: Falls ExtTextOut nicht funktionieren sollte (ist schon ne Weile her dass ich das verwendet habe), dann bleibt noch die Möglichkeit den Bereich einfach vorher mit FillRect zu "löschen" und danach mit TextOut/ExtTextOut drüberzumalen.



  • oder du nimmst eine nichtproportionale schriftart.



  • Die Textausgabe sollte nur im WM_PAINT-Ereignishandler passieren, also innerhalb von BeginPaint und EndPaint (und den DisplayContext-Handle hDC erhält man dann als Rückgabewert von BeginPaint), s. Painting the Window.
    Und da ist es üblich (wie von @hustbaer schon geschrieben), zuerst den gesamten Update-Bereich mit der Hintergrundfarbe zu füllen und erst danach die weiteren Elemente darüber zu zeichnen.
    Besser ist es allerdings, dies im WM_ERASEBKGND-Handler zu erledigen, s.a. Guide to WIN32 Paint for Intermediates.


  • Mod

    @hustbaer sagte in Bei Text ausgabe (Win32) wird dahinter ein ")" angezeigt:

    @SeppJ sagte in Bei Text ausgabe (Win32) wird dahinter ein ")" angezeigt:

    du rechnest in Cent

    Bzw. wenn du dich gleich auf Buchhaltungsquargel und andere Währungen vorbereiten willst, nimm Faktor 10000 oder mehr (100000). Also 10000 = 1 EUR/USD/...

    Für nen Colaautomaten tut's aber vermutlich wenn du Cent nimmst 🙂

    Ja, wenn man ernsthafte Buchhaltung betreiben will, dann sollte man dringend genauer über das Problem nachdenken. Da sind wir dann wieder beim speziell für die Anforderungen entwickelten Währungsdatentyp. Die professionellen Lösungen für das Problem sind unter der Haube meines Wissens nach genau das, was du vorschlägst, nämlich 10000stel-Teile in Ganzzahlvariablen. Damit ist es aber noch nicht getan, weil man ja auch noch definieren muss, wie man beispielsweise Prozentrechnung handhabt. Da gibt es gewiss genaue Vorschriften im Finanzwesen, die ich als Laie aber nicht kenne.

    Falls an der oft erzählten Legende etwas dran sein sollte, von dem Programmierer, der sich die Divisionsreste von Banken auf das eigene Konto überwiesen hat, dann haben die aber wahrscheinlich auch nicht die letztgültige mathematisch exakte Lösung, sondern auch nur irgendwelche Vorgaben, an die man sich hält. Denn mit der perfekten Lösung könnte ja kein Rest bleiben.



  • @Wade1234 sagte in Bei Text ausgabe (Win32) wird dahinter ein ")" angezeigt:

    oder du nimmst eine nichtproportionale schriftart.

    Reicht nicht. Aber wenn er dann zusätzlich noch beim sprintf ne Fixlänge macht, dann ginge das.



  • Danke für eure Hilfe ich könnte das Problem lösen👍


Anmelden zum Antworten