Int in AnsiString
-
Hi,
ich hab mich mittlerweile so richtig mit dem AnsiString angefreundet. Doch auf eine Frage weiss ich immernoch keine Antwort und hab auch nichts in FAQ gefunden.
Was ist die einfachste Variante einen Integer-Wert in einen AnsiString einzufügen?
z.B.:
Paul hat 6 Äpfel.
Thx, Maffe
-
AnsiString test("Paul hat "); test += IntToStr(6); test += " Äpfel.";
Neben der FAQ gibt es auch noch die Borland Hilfe.
-
Stimmt. Entschuldigung, das nächste Mal. Obwohl ich mich nicht erinnern kann diese Funktion dort schon gesehen zu haben.
Danke.
-
geht auch so:
AnsiString test("Paul hat "); test += AnsiString(6); test += " Äpfel.";
-
DreadlockFilbert schrieb:
geht auch so:
AnsiString test("Paul hat "); test += AnsiString(6); test += " Äpfel.";
Das ist aber nicht der Sinn der Sache, denn sonst könnte man es gleich so machen:
AnsiString test("Paul hat 6 Äpfel.");
Ich denke, es ging darum, wie man eine Zahl in String konvertiert.
MfG
xy
-
Was DreadlockFilbert schrieb ist schon richtig, er ruft den Konstruktor von AnsiString mit einem int als Parameter auf. Durchaus erlaubt.
Intern wird ein AnsiString gebastelt, der die IntToStr Funktion als Konstruktor benutzt, und dann wird dieser AnsiString dem ersten zugewiesen.
Es werden also zwei objekte erzeugt, der Integer wird konvertiert und der Overhead ist entsprechend gross.Ist was anderes als einfach zu schreiben:
AnsiString test("Paul hat 6 Äpfel.");
-
Geht dasnicht auchso:
AnsiString test="Paul hat "+IntToStr(6)+" Äpfel";
????
Oder bin ich auf dem Holzweg
-
karahead schrieb:
AnsiString test="Paul hat "+IntToStr(6)+" Äpfel";
Das geht leider nicht. Da sagt der Compiler unerlaubte Zeigeraddition. Ist ein bisschen nervig, muss ich sagen. Wenn ich lange Strings zusammenstellen will, dann steht immer ein riesen Block. Aber was soll's, Hauptsache ist, dass es geht.
-
Maffe001 schrieb:
karahead schrieb:
AnsiString test="Paul hat "+IntToStr(6)+" Äpfel";
Das geht leider nicht. Da sagt der Compiler unerlaubte Zeigeraddition. Ist ein bisschen nervig, muss ich sagen. Wenn ich lange Strings zusammenstellen will, dann steht immer ein riesen Block. Aber was soll's, Hauptsache ist, dass es geht.
Dann hast du das "IntToStr" vergessen.
-
Nein habe ich nicht. Ich hab's gerade ebend nochmal ausprobiert.
Für:DBStrg = "insert into ainfo values ('"; DBStrg += MedMess->AInfo->patID; DBStrg += "', '"; DBStrg += MedMess->AInfo->recID; DBStrg += "', '"; DBStrg += MedMess->AInfo->kinfo; DBStrg += "', '', "; DBStrg += IntToStr (MedMess->AInfo->gewicht); DBStrg += ", "; DBStrg += IntToStr (MedMess->AInfo->groesse); DBStrg += ", "; DBStrg += IntToStr (MedMess->AInfo->alter); DBStrg += ", '"; DBStrg += MedMess->AInfo->geschlecht; DBStrg += "', current_timestamp, 0)";
hatte ich das geschrieben:
DBStrg = "insert into ainfo values ('" + MedMess->AInfo->patID + "', '" + MedMess->AInfo->recID + "', '" + MedMess->AInfo->kinfo + "', '', " + IntToStr (MedMess->AInfo->gewicht) + ", " + IntToStr (MedMess->AInfo->groesse) + ", " + IntToStr (MedMess->AInfo->alter) + ", '" + MedMess->AInfo->geschlecht += "', current_timestamp, 0)";
Und da kam die besagte Meldung.
-
Ich vermute mal, dass die Felder "patID" und "recID" vom Typ Int sind.
Eine einfache Zahl kann ein AnsiString durch Zuweisung konvertieren, aber bei einer Mischung von Text und Zahlen streikt der Compiler.
-
PAB schrieb:
Ich vermute mal, dass die Felder "patID" und "recID" vom Typ Int sind.
Nein, die beiden sind von Typ char*. Sonst hätte der Compiler bei der anderen Variante ja auch gestreikt.
-
void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString test="Paul hat "+ IntToStr(6) +" Äpfel"; }
läuft bei mir problemlos.
C++ Builder 5.0 Build 12.34
-
Also ich hab den BCB 6.0. Müsste ja dann auch funktionieren. Hast du's schon mal mit einem Beispiel mit der Größe von meinem probiert?
Ich könnte mir vorstellen, dass er mit der den Absätzen nicht klar kommt, die ich zur Übersicht gemacht habe. Aber so richtig glauben, tu ich dran. (Ja ich weiss. Man tut nicht "tut" gebrauchen!:D)
Oder vielleicht ist auch die Anzahl von Operatoren limitiert. Weiss das jemand?
-
Maffe001 schrieb:
Nein, die beiden sind von Typ char*.
Das funktioniert nicht. Bei einer "Klartext"-Zeichenkette im Sourcecode kann der Compiler diese implizit nach AnsiString casten und so den '+'-Operator verwenden.
Mit explizit nicht als String deklarierten Variablen geht das nicht, da musst du dem Compiler ausdrücklich sagen, dass er sie als AnsiString betrachten soll, bzw. sie zuvor umwandeln.char *ch; //... AnsiString test = "bla" + String(ch) + "blub";
-
Maffe001 schrieb:
PAB schrieb:
Ich vermute mal, dass die Felder "patID" und "recID" vom Typ Int sind.
Nein, die beiden sind von Typ char*. Sonst hätte der Compiler bei der anderen Variante ja auch gestreikt.
AnsiString Str; int Zahl = 55; Str=Zahl; //Str = "55"
Nein, hätte er nicht
Aber auch ein char* muss umgewandelt werden. Das macht der AnsiString aber nur, wenn auf der rechten Seite keine char* / Text-Mischung steht:
AnsiString Str; char* testvar = "Test"; Str = "Dies ist ein " + AnsiString( testvar ) + "!";
-
Für solche Probleme würde ich eher AnsiString::sprintf empfehlen, dies ermöglicht eine etwas flexiblere und komfortablere Verwendung/Formatierung von Strings...
-junix
-
Ich hab natürlich nicht Deine Dialogboxen, aber folgendes läuft bei mir problemlos:
{ AnsiString DBStrg; AnsiString s = "Blabla"; int i=123; DBStrg = "insert into ainfo values ('"; DBStrg += s; DBStrg += "', '"; DBStrg += s; DBStrg += "', '"; DBStrg += s; DBStrg += "', '', "; DBStrg += IntToStr (i); DBStrg += ", "; DBStrg += IntToStr (i); DBStrg += ", "; DBStrg += IntToStr (i); DBStrg += ", '"; DBStrg += s; DBStrg += "', current_timestamp, 0)"; }
-
KaraHead fragt:
Geht dasnicht auchso:
AnsiString test="Paul hat "+IntToStr(6)+" Äpfel";
Es geht so:
AnsiString test = AnsiString("Paul hat ") + IntToStr(6) + " Äpfel";
-
Hallo Zusammen,
in die Reihe gehört sicher noch das guten alte "sprintf"void __fastcall TForm1::Button1Click(TObject *Sender) { int iAepfel; AnsiString astrHilf; iAepfel = 6; astrHilf.sprintf("Paul hat %2.2d Äpfel", iAepfel); }
Evi48
-
Was ist die __einfachste__ Variante einen Integer-Wert in einen AnsiString einzufügen?
sprintf ist da wohl nicht die richtige Antwort für nen AnsiString...