Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Stunden über 24 Addieren (https://www.delphipraxis.net/193484-stunden-ueber-24-addieren.html)

jacky213 5. Aug 2017 02:02

Stunden über 24 Addieren
 
Moin,

also ich habe viele Stundenangaben im Format 05:30 Stunden/Minuten.

Also zum Beispiel:

Delphi-Quellcode:
05:00
10:00
13:30
03:00
Diese Stunden und Minuten sollen alle lediglich addiert werden und
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;

hoika 5. Aug 2017 05:07

AW: Stunden über 24 Addieren
 
Hallo,
entweder du nimmst TDateTime oder viel besser,
rechne alles in Minuten und formatiere dann nur noch die Ausgabe.

jaenicke 5. Aug 2017 06:08

AW: Stunden über 24 Addieren
 
Recht schnell sollte diese Variante sein:
Delphi-Quellcode:
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)));
Dabei werden einfach die Werte der einzelnen Ziffern addiert ohne diese mit StrToInt usw. umzuwandeln. Dadurch sind das nur ein paar Maschinencodeaufrufe jeweils.

HolgerX 5. Aug 2017 09:14

AW: Stunden über 24 Addieren
 
Hmm..

Ich hätte mir das einfacher gemacht:
Delphi-Quellcode:
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;
Solange die einzelnen Zeilen nur Zeitangaben enthalten, sollte es so funktionieren (Getestet mit D6 ;) ).

jaenicke 5. Aug 2017 10:27

AW: Stunden über 24 Addieren
 
Zitat:

Zitat von HolgerX (Beitrag 1378139)
Ich hätte mir das einfacher gemacht:

Wenn die Geschwindigkeit keine Rolle spielt, kann man es auch so lösen, klar.

Uwe Raabe 5. Aug 2017 10:39

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 17:58 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz