AnsiString umformatieren
-
Hallo zusammen,
ich versuche seit geraumer Zeit einen AnsiString mit dem Format 01.01.2000 (wurde als Datum in der DB aufgenommen) jetzt als 01012000 auszugeben. Ich tue mir hier sehr schwer damit. (BCB6 c++)
Ich habs unter anderem versucht mit:char ch1 = Datum; //AnsiString Datum = Edit->Text; int d; while (d != strlen(ch1)) { if(ch1[d] == ".") { ch1[d] = ""; } }
Habe ich dann meinen AnsiString als 01012000 möchte ich diesen mit
int date 01012000; int year; int month; int day; year = date %10000 month = (date/10000)%100 day = date / 1000000
zerlegen um die Jahreszahl, den Monat und den Tag je als Zahl zu erhalten.
Letzteres funktioniert bei der Eingabe der Zahl manuell. Versuche ich mit der Variablen Datum zu arbeiten bekomme ich Fehlermeldungen.
Wo liegt mein Denkfehler?
Über eine kleine Hilfe wäre ich sehr dankbar!
Gibt es vielleicht einen einfacheren Weg und ich stehe auf dem Schlauch?LG
-
Du hast da mehrere Böcke drin:
Zeile 1: char ch1 = Datum; // char ist ein Zeichen, Datum ist was? Hoffentlich kein Ansi- oder sonstwas String
Zeile 3: d ist nicht initialisiert
Zeile 5 + 7: ch1 ist ein einzelnes Zeichen und erlaubt keine Index-ZugriffeDu kannst per
SubString
einzelne Teilstring extrahieren und dann nachint
wandeln (Achtung: Delphi Strings fangen bei der Inzierung bei 1 an!)AnsiString datum = "01012020"; AnsString month_part = datum.SubString( 1, 2 ); // 2 Zeichen ab Index 1 AnsString day_part = datum.SubString( 4, 2 ); // 2 Zeichen ab Index 4 AnsString year_part = datum.SubString( 7, 2 ); // 4 Zeichen ab Index 7 unsigned int month = StrToInt( month_part ); unsigned int day = StrToInt( day_part ); unsigned int year = StrToInt( year_part );
-
@Traugott sagte in AnsiString umformatieren:
char ch1 = Datum; //AnsiString Datum = Edit->Text;
Das kann doch schon nicht richtig sein.
char
ist für exakt 1 einziges Zeichen.Ich weiß jetzt nicht, ob der AnsiString nicht schon selbst ersetzen kann. Finde irgendwie kaum Doku. Es scheint aber c_str zu geben.
Also (ungetestet) so:
const char *c = Datum.c_str(); char no_punct[100]; char *dest = no_punct; while (*c) { if (*c != '.') *dest++ = *c; ++c; } *dest = 0;
Hat der BCB kein
strptime
? Ich denke nämlich nicht, dass es sinnvoll ist, die Punkte aus dem Datum rauszunehmen. Das kann doch nur zu Fehlern führen?!
-
@Traugott sagte in AnsiString umformatieren:
Datum
Ein
char
ist kein String, es kann nur ein Zeichen aufnehmen.Und wenn du die Punkte entfernt hast, musst du den String in eine Ganzzahl (int) umwandeln.
Du kannst aber auch aus dem String lesen und gleich in die Variablen speichern.
if (sscanf(Datum.c_str(), "%d.%d.%d", &day, &month, &year) == 3) { ...}
-
@Traugott sagte in AnsiString umformatieren:
ich versuche seit geraumer Zeit einen AnsiString mit dem Format 01.01.2000 (wurde als Datum in der DB aufgenommen) jetzt als 01012000 auszugeben. Ich tue mir hier sehr schwer damit. (BCB6 c++)
Wenn das Datum aus einer Datenbanktabelle stammt, so ist diese Spalte hoffentlich als
date
angelegt, so daß du sie in eineTDateTime
(bzw.TDate
)-Variable auslesen kannst.Und für die Umwandlung bzw. Extraktion gibt es diverse Funktionen: Unterstützung für Datum und Uhrzeit, z.B.
DecodeDate
(selbst beim BCB6 sollten diverse Funktionen dazu inSystem.DateUtils
schon existieren).Und falls es doch nur als String vorliegt, dann einfach eine der
(Try)StrToDate...
-Funktionen vorher benutzen.
-
Hallo zusammen,
Vielen herzlichen Dank für die Vielen Antworten und Vorschläge.
Manchmal braucht man halt einen Schubser !!!!!!!LG