Du bist nicht angemeldet.

Werbeanzeige

Korowai

Treue Seele

  • »Korowai« ist der Autor dieses Themas

Beiträge: 192

Wohnort: Mitten in D

Beruf: Architekt

  • Private Nachricht senden

1

02.07.2017, 05:46

c/ c++ Eingabe von Zahlen

Hi,

gibt es für folgenden code eine elegantere Lösung?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
            int textvar;
            textvar=GetWindowText(GetDlgItem(hDlg31, 419),Auftragssumme, MAX_PATH);
            
            float Summe;
            char *end;
            int Laenge= strlen(Auftragssumme);
            
            if (Auftragssumme[Laenge-3]==',')
            {
                Auftragssumme[Laenge-3]='.';
            }
            if (Auftragssumme[Laenge-2]==','&&(isdigit(Auftragssumme[Laenge-1])))
            {
                Auftragssumme[Laenge-2]='.';
            }

            Summe=strtof(Auftragssumme,&end);
            if (strlen(end)>=2)
            {
                MessageBox(hDlg31, TEXT ("Zahl ist false"), "EXO 1.2", MB_ICONEXCLAMATION|MB_OK);
                SetFocus (GetDlgItem(hDlg31, 419));
                return FALSE;
            }
            else
            {
                MessageBox(hDlg31, TEXT ("Zahl ist true"), "EXO 1.2", MB_ICONEXCLAMATION|MB_OK);
                SetFocus (GetDlgItem(hDlg31, 419));
                return FALSE;
            }


Auftragssumme wird aus einem edit control eingelesen.

David Scherfgen

Administrator

Beiträge: 9 954

Wohnort: Bonn

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

02.07.2017, 11:03

Erklär mal bitte, was du eigentlich erreichen möchtest.
Was, wenn die Länge des eingegebenen Texts kleiner als 3 ist? Dann greifst du auf einen negativen Index zu, was zu undefinierten Verhalten führt.
Was, wenn ich “100,000“ eingebe?
Was soll “Zahl ist true“ bedeuten?
Es ist übrigens keine gute Idee, Geldbeträge in floats zu speichern (gilt auch für double). Google mal nach “why not use float for money“.
Für die eigentliche Konvertierung solltest du nicht die alten C-Funktionen nutzen, sondern lieber std::istringstream, außerdem std::string statt char*.
Und dann verwendest du noch magic numbers wie 419 und nichtssagende Namen wie hDlg31.
Alles in allem ziemlich vermurkster Code! ;)

Korowai

Treue Seele

  • »Korowai« ist der Autor dieses Themas

Beiträge: 192

Wohnort: Mitten in D

Beruf: Architekt

  • Private Nachricht senden

3

02.07.2017, 19:02

Hi Daniel,

mein Problem ist, dass üblicherweise "." für die Trennung für EURO und CENT verwendet wird.

Deutsche User geben aber ein "," ein.

Ich habe mich daran versucht, dafür eine Lösung zu beginnen. SO mittendrin erfuhr ich dann aber, dass es da eine viel einfachere Lösung gibt, als den char Zeichen für Zeichen durchzusehen.

Dachte, dass das jemand aus dem code direkt erkennt und die Lösung parat hat.

Deine Anmerkungen sind mir teilweise bekannt; der gepostete code ist noch nicht fertig. Anderem kann ich gut folgen und danke Dir für den Hinweis auf die stringstreams. Das sehe ich mir an, denn es taucht auf vielen Seiten im Netz auf. habe es aber noch nicht genauer angesehen, wohl, weil ich mich anhand dem älteren,aber mMn sehr guten Buch von Petzold mit der WINAPI beschäftige und es damals noch keine stringstreams gab...

Ich glaube, eine einfachere Lösung müsste darin bestehen, den Hinweis der MSDN (siehe link unten) umzudrehen und statt der US Interpretation die Deutsche / Europäische einzustellen. Aber vielleicht (auf jeden Fall :)) gibt es auch eine Möglichkeit, an die ich noch nicht gedacht habe...

https://social.msdn.microsoft.com/Forums/de-DE/4b1f4c33-b323-4cbd-bc2a-36cf74fc8a5c/double-mit-punkt-oder-komma?forum=visualcclide

Werbeanzeige