fließkommazahl in zeitangabe umwandel?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Zerosurf
Beiträge: 131
Registriert: 11.10.2005 15:46

fließkommazahl in zeitangabe umwandel?

Beitrag von Zerosurf »

Hallo Leute!
Bin grad dabei mein erstes Programm in PB zu schreiben.
Dabei geht es um Berechnungen mit Medikamentendosis und Milliliter und Minuten bzw. Stunden.

Jetzt hab ich folgendes Problem:
Aus einem bestimmten Ergebniss (z.B.: 2,78) würde ich gerne eine Zeitangabe haben -> Beispiel: 2,78 soll zu "3 Stunden 18 Minuten" umgewandelt werden.

Wie mache ich das am besten?

mfg. Zerosurf

Bzgl. Beistrich:
Der Beistrich wird bei mir vor einer Berechnung mittels ReplaceString zu einem Punkt umgewandelt ->

Code: Alles auswählen

gm.f = ValF(ReplaceString(GetGadgetText(6), ",", ".", 2))
und nach der Berechnung wird der Punkt wieder zu einem Beistrich ->

Code: Alles auswählen

result1$ = ReplaceString(StrF(gm,2), ".", ",", 2)
Hier zeige ich euch was ich meine:
Bild
Bei der Infusionsdauer sollte dann stehen: "2 Std. 19 Min."
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Beitrag von Laurin »

Ich habe es nicht ganz verstanden.

Soll 2,78 zu 2,78 Std. alias 2 Std. 46 Min. 48 Sek. werden oder wie?
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
Benutzeravatar
zigapeda
Beiträge: 1753
Registriert: 06.03.2005 17:22
Wohnort: Kaufbeuren
Kontaktdaten:

Beitrag von zigapeda »

und wie ist die formel?
oder frägst du uns weil du keine weißt, aber du eine brauchst?
kluger Mann + kluge Frau = Romanze | dummer Mann + dumme Frau = Schwangerschaft
kluger Mann + dumme Frau = Affäre | dummer Mann + kluge Frau = Shopping <)
Benutzeravatar
crossroads
Beiträge: 244
Registriert: 29.08.2004 05:41
Wohnort: Rhine Main Area

Beitrag von crossroads »

So wie ich es verstanden habe, wird 2,78 zu 2 Std. 78 Min. bzw. 3 Std. 18 Min.
Man müßte also den Integerwert (das sind die Stunden; hier 2) in eine Variable hh.l wandeln, die Nachkommastellen (die Minuten; hier 78 ) in die Variable mm.l

Code: Alles auswählen

result$ = "2,78"
hh.l = 2
mm.l = 78
Dann die Korrektur:

Code: Alles auswählen

While mm > 60
  hh + 1
  mm - 60
Wend
Debug result$ + " wird zu: " + Str(hh) + " Stunden " + Str(mm) + " Minuten"
Ist es das, was Du suchst?
Man soll die Tür aufmachen, bevor man durchgeht ...
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

Ich würde es so machen:

Code: Alles auswählen

f.f = 2.78
sec = f*3600
Debug Str(sec/3600)+":"+Str((sec/60)%60)+":"+Str(sec%60)
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
crossroads
Beiträge: 244
Registriert: 29.08.2004 05:41
Wohnort: Rhine Main Area

Beitrag von crossroads »

Deeem2031 hat geschrieben:Ich würde es so machen:

Code: Alles auswählen

f.f = 2.78
sec = f*3600
Debug Str(sec/3600)+":"+Str((sec/60)%60)+":"+Str(sec%60)
Stimmt aber nicht. 2,78 soll bedeuten: 2 Std. 78 Min. Daraus soll werden: 3 Std 18 Min.

Bei Dir kommt raus:
2:46:48

Bei meiner Version:
2,78 wird zu: 3 Stunden 18 Minuten
Man soll die Tür aufmachen, bevor man durchgeht ...
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

Klingt leicht unlogisch. Weil ich frag mich grad wie er solche Floatzahlen erstellt. Er müsste die ja erst zusammenflicken, damit er sie wieder auseinander nehmen kann. Reichlich komisch..
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Beitrag von Laurin »

Die Zahl 2,78 an sich ist merkwürdig.
Die 2 soll 2 Std. bedeuten. Eigendlich müsste doch die 2 eher 200 Minuten als 120 Minuten bedeuten.
Das würde bedeuten, dass 2,78 eigendlich 278 Minuten alias 4 Std. 38 Min. sein müssten.

Oder es ist andersherum:
2,78 entspricht 2,78 Std alias 2 Std. 46 Min. 48 Sek.

@Deeem
Genau das finde ich auch. Irgendwie ist das komisch.
Zuletzt geändert von Laurin am 16.10.2005 02:15, insgesamt 2-mal geändert.
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
Benutzeravatar
crossroads
Beiträge: 244
Registriert: 29.08.2004 05:41
Wohnort: Rhine Main Area

Beitrag von crossroads »

Deeem2031 hat geschrieben:Klingt leicht unlogisch. Weil ich frag mich grad wie er solche Floatzahlen erstellt. Er müsste die ja erst zusammenflicken, damit er sie wieder auseinander nehmen kann. Reichlich komisch..
Ich vermute mal, es existiert eine Formel zur Berechnung der Infusionsdauer, die er 1:1 umgesetzt hat und diese Formel spuckt einen Wert in dieser seltsamen Art aus.

Edit: letztendlich darf man wohl den Wert 2,78 nicht als Fließkommazahl ansehen, sondern als eine eigenwillige Art der Darstellung STD,MIN
Zuletzt geändert von crossroads am 16.10.2005 02:16, insgesamt 1-mal geändert.
Man soll die Tür aufmachen, bevor man durchgeht ...
Benutzeravatar
jear
Beiträge: 288
Registriert: 17.10.2004 01:59
Wohnort: Ammerland

Beitrag von jear »

Wie genau soll es ein?

Code: Alles auswählen

; auf die Sekunde genau
Procedure.s MakeTimeString_1(tdec.f)
  ProcedureReturn FormatDate("%hh:%ii:%ss", tdec * 3600)
EndProcedure

; auf Hundertstel genau
Procedure.s MakeTimeString_2(tdec.f)
  Protected time.l, hh.w, ii.w, ss.w, hs.w, out.s
  time = tdec * 360000
  hs = time % 100 : time / 100
  ss = time % 60  : time / 60
  ii = time % 60  : time / 60
  hh = Int(time)
  out = RSet(Str(hh), 2, "0")
  out + ":" + RSet(Str(ii), 2, "0")
  out + ":" + RSet(Str(ss), 2, "0")
  out + "." + RSet(Str(hs), 2, "0")
  ProcedureReturn out
EndProcedure


Debug MakeTimeString_1(2.51234567)
Debug MakeTimeString_2(2.51234567)
Man ist nie zu alt zum lernen, auch wenn man dabei manchmal alt aussieht!
Antworten