![]() |
Stunden über 24 Addieren
Moin,
also ich habe viele Stundenangaben im Format 05:30 Stunden/Minuten. Also zum Beispiel:
Delphi-Quellcode:
Diese Stunden und Minuten sollen alle lediglich addiert werden und
05:00
10:00 13:30 03:00 das Ergebnis soll auch nur in Stunden ausgegeben werden. Daher also 31:30 Stunden/Minuten. Wie schaffe ich das? im übrigen habe ich mir da was zum umwandeln von Dezimaler Uhrzeit zu normaler Zeit in Stunden und Minuten zusammengebastelt und finde das es grausam aussieht (funktioniert soweit aber). Das bekommt man sicher besser hin:
Delphi-Quellcode:
tinfo kommt im Format 12:00
function DezToTime (tinfo:string) : String; var Str : String; begin Str := floattostr(strtofloat(tinfo) - Strtofloat(Copy(tinfo,0,Pos(',',tinfo)-1))); Str := floattostr(strtofloat(str) * strtofloat('60')); Str := floattostr(round(strtofloat(str))); Result := Copy(tinfo,0,Pos(',',tinfo)-1) +':'+str; end; |
AW: Stunden über 24 Addieren
Hallo,
entweder du nimmst TDateTime oder viel besser, rechne alles in Minuten und formatiere dann nur noch die Ausgabe. |
AW: Stunden über 24 Addieren
Recht schnell sollte diese Variante sein:
Delphi-Quellcode:
Dabei werden einfach die Werte der einzelnen Ziffern addiert ohne diese mit StrToInt usw. umzuwandeln. Dadurch sind das nur ein paar Maschinencodeaufrufe jeweils.
uses
Math; function GetHourSum(const AValues: TStrings): Double; var CurrentValue: string; begin Result := 0; for CurrentValue in AValues do if Length(CurrentValue) >= 5 then begin Result := Result + (Ord(CurrentValue[1]) - 48) * 10; Result := Result + Ord(CurrentValue[2]) - 48; Result := Result + (Ord(CurrentValue[4]) - 48) / 6; Result := Result + (Ord(CurrentValue[5]) - 48) / 60; end; end; function HoursToStr(const AValue: Double): string; begin Result := IntToStr(Floor(AValue)) + ':' + IntToStr(Round(Frac(AValue) * 60)); end; // Als Beispiel hatte ich hier die Werte in Memo1 stehen: ShowMessage(HoursToStr(GetHourSum(Memo1.Lines))); |
AW: Stunden über 24 Addieren
Hmm..
Ich hätte mir das einfacher gemacht:
Delphi-Quellcode:
Solange die einzelnen Zeilen nur Zeitangaben enthalten, sollte es so funktionieren (Getestet mit D6 ;) ).
uses
DateUtils; procedure TForm1.Button1Click(Sender: TObject); var i : integer; D : TDateTime; H : integer; M : integer; begin D := 0.0; // Summieren der Zeiten for i := 0 to Memo1.Lines.Count-1 do D := D + StrToTime(Memo1.Lines[i]); // Stunden / Minuten H := HoursBetween(0.0,D); M := MinuteOf(D); ShowMessage(IntToStr(H) + ':' + IntToStr(M)); end; |
AW: Stunden über 24 Addieren
Zitat:
|
AW: Stunden über 24 Addieren
Da bisher nichts über die verwendete Delphi-Version gesagt wurde, werfe ich mal eine Lösung mit TTimeSpan ein. Sicher nicht die schnellste Lösung, sieht aber etwas eleganter aus:
Delphi-Quellcode:
program Project259;
{$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils, System.TimeSpan, System.Classes; function GetTimeSum(const AValues: array of string): TTimeSpan; var CurrentValue: string; begin Result := TTimeSpan.Zero; for CurrentValue in AValues do begin Result := Result + TTimeSpan.Parse(CurrentValue); end; end; procedure Main(); var ts: TTimeSpan; begin ts := GetTimeSum(['05:00', '10:00', '13:30', '03:00']); Writeln(Format('%.2d:%.2d', [Trunc(ts.TotalHours), ts.Minutes])); end; begin try Main; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; Readln; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz