Format(xx) -> Integer im AnsiString formatieren



  • Hallo zusammen,

    möchte aus 3 Zahlen (Stunden, Minuten, Sekunden) das Format hh🇲🇲ss erhalten.
    Dazu verwende ich im BCB6 (Time1 und Time2 sind unterschiedliche TDateTime Vars):

    Integer i2,i3,i4; AnsiString z1; 
    
     i2=HoursBetween(Time2, Time1);                                                 // Differenz Stunden
     i3=MinutesBetween(Time2, Time1);                                               // Differenz Minuten
     i4=SecondsBetween(Time2, Time1);                                               // Differenz Sekunden
     z1=Format("%2d:%2d:%2d",ARRAYOFCONST((i2,i3,i4)));                             // Ausgabe hh:mm:ss
    

    Heraus kommt aber z.B.: 12: 1: 9 statt 12:01:09
    In der Hilfe des BCB steht aber, wenn eine Längenbezeichnung (hier %2d) angegeben ist, dann wird linksbündig mit Nullen aufgefüllt. Ist die Funktion
    fehlerhaft oder mache ich einen Denkfehler (sprich was falsch)?

    MfG Stefan Scholz



  • Ich kenne diese Formatierungen nur von man: printf(3) - und da wird defaultmäßig mit Leerzeichen aufgefüllt. Versuch's doch mal mit dem Formatstring "%02d".



  • ...geht leider nicht. Keine führende Null.

    Danke aber für den schnellen Tip!

    Gruss Stefan



  • Hallo

    offenbar gibt es da bei der VCL-Funktion Format einen Fehler, das auffüllen mit der 0 wird nicht unterstützt. Bei sprintf gehts :

    #include <stdio.h>
    
    Integer i2 = 4,i3 = 6,i4 = 5;
    char text[20];
    sprintf(text, "%02d:%02d:%02d", i2,i3,i4);
    Label1->Caption =Format("%02d:%02d:%02d",ARRAYOFCONST((i2,i3,i4))) + " " + text;
    

    bis bald
    akari



  • Hallo, Akari

    so geht es in der Tat:

    char c1[20];
     i2=HoursBetween(Time2, Time1);                                                 // Differenz Stunden
     i3=MinutesBetween(Time2, Time1);                                               // Differenz Minuten
     i4=SecondsBetween(Time2, Time1);                                               // Differenz Sekunden
     sprintf(c1, "%02d:%02d:%02d", i2,i3,i4);
    

    Vielen Dank, da kann man manchmal wirklich lange suchen 😉
    Gruss, Stefan Scholz



  • Es geht schon. Man muß die Hilfe nur gründlich lesen.

    If the format string contains a precision specifier, it indicates that the resulting string must contain at least the specified number of digits; if the value has less digits, the resulting string is left-padded with zeros.

    Das bedeutet, dass der Precision-Specifier (und width) angegeben werden muß. Also so

    z1=Format("%2.2d:%2.2d:%2.2d",ARRAYOFCONST((i2,i3,i4)));
    


  • Noch was.
    Auch AnsiString hat eine Memberfunktion namens sprintf. So kann man akaris Beispiel etwas vereinfachen

    Integer i2 = 4,i3 = 6,i4 = 5;
    Label1->Caption =text.sprintf("%02d:%02d:%02d", i2,i3,i4);
    


  • Werden die HoursBetween etc. noch an anderer Stelle als Einzelwerte benötigt? Das Geraffel kann man sich sonst bzw. überhaupt auch sparen:

    z1 = FormatDateTime("hh:mm:ss", Time2 - Time1);
    

Anmelden zum Antworten