TEdit zu string
-
Hallo,
habe ein Problem und zwar in TEdit habe ich ein (Punkt) und brauche aber ein (Komma) um in Double was zu Berechnen.
ein Beispiel
double dDummy; stringstream stream; string text = "1.1"; stream << text; stream >> dDummy;
Das funktioniert möchte aber das man TEdit einbinden
double dDummy; stringstream stream; string text = Edit1->Text; stream << text; stream >> dDummy;
Dann kommt folgender Fehler
[bcc32 Fehler] Search.cpp(262): E2285 Keine Übereinstimmung für 'string::basic_string(const string&)' gefunden
Ich hoffe das kann mir einer helfen. Habe schon vieles Probiert leider kein Erfolg gehabt
Oder vielleicht gibt es ja auch eine andere Möglichkeit einfach den (Punkt) in (Komma) zumachen.
-
Hallo
Grundsätzlich must du zwischen dem String der VCL und dem string des C++ Standards über einen C-String hin- und herkonvertieren:
string text = Edit1->Text.c_str();
Allerdings solltest du in VCL-Projekten der Einfachkeit halber möglichst immer den String der VCL benutzen. Deine eigentliche Aufgabe läßt sich zum Beispiel viel einfacher mit der Funktion StringReplace ausführen.
bis bald
akari
-
Danke ich habe das mit
AnsiString sStr = Edit1->Text; sStr = AnsiReplaceText(sStr,".",","); dDummy = sStr.ToDouble();
gelöst.
-
Verwende lieber DecimalSeparator statt den "Fest" hinterlegten Komma ","
sStr = AnsiReplaceText(sStr,".", DecimalSeparator);
-
Er sagt mir
[bcc32 Fehler] Search.cpp(265): E2451 Undefiniertes Symbol 'DecimalSeparator'
-
Hast du
SysUtils.hpp
inkludiert?
-
ja habe ich
#include "System.SysUtils.hpp" oder #include "SysUtils.hpp"
geht beides nicht.
Ich habe die C++ Builder XE4 ka ob da wieder was mit ist.
-
Warum
"SysUtils.hpp"
und nicht<SysUtils.hpp>
?Sonst versuche mal
#include "SysUtils.pas" //oder hald #include <SysUtils.pas>
Oder gleich den DecimalSeparator von TFormatSettings
-
phanzy schrieb:
Warum
"SysUtils.hpp"
und nicht<SysUtils.hpp>
?Sonst versuche mal
#include "SysUtils.pas" //oder hald #include <SysUtils.pas>
Oder gleich den DecimalSeparator von TFormatSettings
geht nicht
wen ich das so mache
TFormatSettings FS; sStr = AnsiReplaceText(sStr,".", FS.DecimalSeparator);
löscht er alles hinter den "."
z.B. schreibe ich "27.3" kommt nur "27" raus
-
Und was ist mit dem Vorschlag, <> statt "" zu verwenden?
"" nimmt man doch nur bei lokalen Header-files.
-
Habe ich ja gemacht geht nicht
-
Achja stimmt, übersehn.
Schau mal hier bzw. hier. (Zweiteres ist für XE4.)
Sonst weiß ich auch nicht weiter.
Aber btw, hast du es nicht bereits mit folgendem Code gelöst?
AnsiString sStr = Edit1->Text; sStr = AnsiReplaceText(sStr,".",","); dDummy = sStr.ToDouble();
-
akari schrieb:
Hallo
Grundsätzlich must du zwischen dem String der VCL und dem string des C++ Standards über einen C-String hin- und herkonvertieren:string text = Edit1->Text.c_str();
Dann kommt auch in meinem XE2 dieser Fehler
Rave173 schrieb:
Dann kommt folgender Fehler
[bcc32 Fehler] Search.cpp(262): E2285 Keine Übereinstimmung für 'string::basic_string(const string&)' gefunden
In neueren C++ Buildern (ab 2009) müsste es heißen
std::wstring text = Edit1->Text().c_str();
oder
std::string text = AnsiString(Edit1->Text()).c_str();
Zum eigentlichen Problem:
In XE2 geht das hier
void __fastcall TfrmMain::btnTestClick(TObject *Sender) { UnicodeString s = StringReplace(Edit1->Text, L".", L",", TReplaceFlags()); try { double d = s.ToDouble(); } catch(EConvertError &e) { // keine Zahl } }
-
nn schrieb:
In XE2 geht das hier
void __fastcall TfrmMain::btnTestClick(TObject *Sender) { UnicodeString s = StringReplace(Edit1->Text, L".", L",", TReplaceFlags()); try { double d = s.ToDouble(); } catch(EConvertError &e) { // keine Zahl } }
Problem ist nur für'ste den Code auf einen zB. English Formatierten Rechner aus landet man immer im Catch Bereich, da Komma der 1000ter Seperator ist und ein Punkt der DecimalSeparator (nicht wie in Deutschland Komma für Dezimal und Punkt für 1000ter) deshalb auch die Anmerkung den 'DecimalSeparator' zu verwenden.
Habe leider keine Ahnung wie man den Neuzeitigen 'DecimalSeparator' verwendet über TFormatSettings (verwende nur die 2009ner Version)
-
Rave173 schrieb:
wen ich das so mache
TFormatSettings FS; sStr = AnsiReplaceText(sStr,".", FS.DecimalSeparator);
löscht er alles hinter den "."
z.B. schreibe ich "27.3" kommt nur "27" rausDas ist ja logisch, wenn du eine Variable 'TFormatSettings FS' anlegst, dann mußt du diese auch initialisieren, ansonst steht da irgend etwas drin.
Wenn in FS.DecimalSeparator NULL drin steht, bedeutet das Ende des Strings.TFormatSettings hat dazu die Funktion Create().
TFormatSettings FS; FS.Create(); sStr = AnsiReplaceText(sStr,".", FS.DecimalSeparator);
Versuche es mal mit:
sStr = AnsiReplaceText(sStr,".", FormatSettings.DecimalSeparator);
FormatSettings ist eine globale Variable, die vom C++Builder automatisch angelegt und beim Programmstart initialisiert wird.
-
Vorsicht schrieb:
Problem ist nur für'ste den Code auf einen zB. English Formatierten Rechner aus landet man immer im Catch Bereich,
Das ist richtig, habe ich vergessen noch dabei zu schreiben.
Mir ging es eigentlich nur darum, dass Edit1->Text kein AnsiString ist. Bei jeder Umwandlung von da zu std::string braucht es ein temporäres AnsiString Objekt und eine Zeichensatzkonvertierung.
Appropos neuzeitig: Wenn man die Delphi Doku auf die neuen C++ Builder für iOS und Android extrapoliert, wird es dort wohl auch kein AnsiString und zugehörige Funktionen mehr geben ...
-
Danke für die Antworten
Es geht mit
sStr = AnsiReplaceText(sStr,".", FormatSettings.DecimalSeparator);