Announcement

Collapse
No announcement yet.

AnsiString To Float??

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • AnsiString To Float??

    Moins! Bin noch nicht all zu lange bei C++
    Ich habe schon so einige Seiten im Internet und auch schon so zimlich alles in der Hilfe im C++ Builder 6 Pro durchsucht, habe aber keinerlei Hinweise darauf gefunden, ob und wenn ja, wie es möglich ist, einen AnsiString in eine Float Var. zu transferieren. Der Compiler meldet bei allen Versuchen nur Fehler. Ich versuche von 2 TEdit->Text Feldern Zahlen einzulesen, die ich in einer Rechnung benötige und das Ergebnis soll dann an ein drittes TEdit->Text Feld übergeben werden. Ich benötige in dem ergebnis allerdings die Nachkommastellen. Wie kann ich das lösen? Ich bitte um Hilfe

    Patrick

  • #2
    Funktion StrToFloat verwenden (siehe CBuilder-Hilfe)

    Gruß Ud

    Comment


    • #3
      oder so:

      float x = atof(Edit1->Text.c_str())

      Comment


      • #4
        danke für die promte Hilfe, es läuft jetzt ;

        Comment


        • #5
          Hallo zusammen,


          ich möchten diesen Thread nochmals aufbringen da ich ein kleines Problem habe mit atof().

          Wenn ich atof() verwende mit meinen Einstellungen (Schweiz) funktioniert das Prima! Wenn jetzt jedoch der Österreichische Kunde die Software einsetzt und das ',' als Trennzeichen hat und nicht '.' dann schlägt atof fehl, respektive hackt Zeichen ab. Beispiel:



          atof(1,5) -> 1
          atof(1.5) -> 1.5

          Der Österreicher, oder auch Deutschländer (oder?) gibt ja die 1,5 ein und nicht die 1.5, insofern schlägt meine Funktion fehl....



          Kennt da jemand die Ursache dafür?


          Vielen Dank

          Comment


          • #6
            1,5 ist kein float-Wert, das hat nichts mit der Nationalität zu tun
            http://www.cplusplus.com/reference/c...dlib/atof.html

            offenbar fehlt bei dir eine Eingabevalidierung, bevor du mit der Eingabe weiter arbeitest
            Zuletzt editiert von Christian Marquardt; 18.12.2008, 18:39.
            Christian

            Comment


            • #7
              Originally posted by roman.haas View Post
              Hallo zusammen,
              Wenn ich atof() verwende mit meinen Einstellungen (Schweiz) funktioniert das Prima! Wenn jetzt jedoch der Österreichische Kunde die Software einsetzt und das ',' als Trennzeichen hat und nicht '.' dann schlägt atof fehl, respektive hackt Zeichen ab.
              Dass stimt weil atof immer ein '.' erwartet als decimalseparator.

              Du hast zwei Lösungsmöglichkeiten.

              A. Wenn du atof weiter benutzen willst dan mache erst eine stringreplace
              von ',' nach '.'. Du benutzt irgend wo ach noch ftoa in dein Program? Dann auch
              selbst '.' in ',' umsetzen.

              B. Benutze StrToFloat. Die kann mit beide umgehen. Na ja nicht ganz automaties.

              Es gibt in C++Buider eine globale variabele

              // char DecimalSeparator.

              Diese enthalt abhangig von die Einstellungen eine ',' oder '.'. Siehe:

              Label1->Caption = DecimalSeparator;

              Du kannst auch diese selbs setzen

              DecimalSeparator = ',';

              Wenn du dass tust dan zuerst die momentane Wert speichern und nach ablauf
              zurück setzen;

              Comment


              • #8
                Sinnvoller wäre allerdings eine Eingabeprüfung oder besser, nicht zulässige Zeichen erst gar nicht eingeben können.
                Christian

                Comment


                • #9
                  Super vielen Dank für die Antworten.


                  Christian, 1,5 ist ein gültiger Floatingpoint Wert für einen Österreicher oder Franzose (zum Beispiel).


                  Es ging ja darum, dass man dem Kunden nicht ein System (in meinem Fall mit dem '.') aufzwinge, sondern das der das System so nutzen kann wie er es kennt.


                  Ich habe es nun hingekriegt, so dass der Kunde seinem System entsprechend die Eingabe tätigen kann, und meine Funktionen trotzdem noch funktionieren.



                  Vielen Dank!

                  Comment


                  • #10
                    Seit wann kann ein float Kommata enthalten? Nun es mag in der Schweiz/Österreich/Frankreich andere C/C++ Versionen geben....

                    http://www.imb-jena.de/~gmueller/kurse/c_c++/c623.html

                    Schade, dass das International so keine Berücksichtung findet
                    Christian

                    Comment


                    • #11
                      Dass stimt weil atof immer ein '.' erwartet als decimalseparator.
                      Man kann auch atof zur Umwandung nehmen sowohl für ".", als auch für "," -> LC_NUMERIC umstellen
                      Christian

                      Comment


                      • #12
                        Originally posted by Christian Marquardt View Post
                        Man kann auch atof zur Umwandung nehmen sowohl für ".", als auch für "," -> LC_NUMERIC umstellen
                        Aber wie?

                        Mit

                        Label6->Caption = LC_NUMERIC;

                        sehe Ich hier eine 16.

                        Mit eine advanced googlesearch finde Ich irgendwo:

                        setlocale(LC_NUMERIC,"C");

                        und weiter abacadabra.

                        Ich denke es ist Zeit für ein "Neuer Quicky"

                        Comment


                        • #13
                          Quicky? Meinst du wirklich....hmm ich bevorzuge zurzeit mehr so Java (Netbeans). Finde für den Preis des C++Builder 2009 haben die wirklich wenig getan. Da macht es mit einer IDE wie oben doch mehr Spass....Zumal man 90% genau so umsetzen kann.
                          Christian

                          Comment


                          • #14
                            Wenn du die Eingaben mit einem MaskEdit auf z.B 2 Nachkommastellen begrenzt:

                            Code:
                            sscanf(AnsiString.c_str(), "%d%c%d", &intValue1, &DecSep[0], intValue2);
                            floatValue = intValue1 + intValue2/100.;
                            
                            Label->Caption = FormatFloat ("000.00 " + floatValue);

                            Comment


                            • #15
                              Originally posted by Christian Marquardt View Post
                              Seit wann kann ein float Kommata enthalten? Nun es mag in der Schweiz/Österreich/Frankreich andere C/C++ Versionen geben....

                              http://www.imb-jena.de/~gmueller/kurse/c_c++/c623.html

                              Schade, dass das International so keine Berücksichtung findet

                              Ja ich habe mich falsch ausgedrückt. Natürlich ist ein Wert vom Typ Float immer mit '.' als decimal Trennzeichen. Jedoch kann der Benutzer ja kein Float eingeben, sonder ein Benutzer gibt immer Zeichen vom Typ char ein.


                              Insofern hast Du natürlich recht....

                              Comment

                              Working...
                              X