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-Zugriffe

    Du kannst per SubString einzelne Teilstring extrahieren und dann nach int 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 eine TDateTime (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 in System.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


Anmelden zum Antworten