Precyzyjne formatowanie liczb

0

Konwersja daje dziwny wynik..... Jak zakodzić to prawidłowo?

procedure TForm1.Button1Click(Sender: TObject);
var
Godziny,Wynik: Double;
begin
Godziny:=2050; //Liczba godzin
Wynik:=(Godziny / 60);
(Sender as TButton).Caption:=FloatToStrF(Wynik,ffNumber,8,2);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
Godziny,WynikMSB,WynikLSB: integer;
begin
Godziny:=2050; //Liczba godzin
WynikMSB:=Godziny div 60;
WynikLSB:=Godziny mod 60;
(Sender as TButton).Caption:=FloatToStrF(WynikMSB,ffNumber,8,0)+','+FloatToStrF(WynikLSB,ffNumber,2,0)
end;

0

A co chcesz uzyskać? Jak ma być sformatowany wynik?

0

Tester, zacząłbym od tego że warto podawać precyzyjne pytania:

Konwersja daje dziwny wynik....

Określ wprost jaki to wynik. I jaki uważasz że powinien być.

Nie oczekuj że ludzie zaczną teraz masowo tworzyć odpowiednie projekty i kompilować Twój program, tylko dlatego że nie podałeś wyniku. Oczywiście możesz mieć szczęście i trafić na kogoś kto ma za dużo wolnego czasu, ale można też szczęściu pomóc.

0

WynikMSB,WynikLSB to integer, więc użyj IntToStr, a nie FloatToStrF, skąd w ogóle pomysł, żeby użyć tej funkcji?

zamiast ffNumber proponuje też używać ffFixed

0

Chyba wiem o co mu chodzi - tester, użyj mod i div z wartością po prawej = 100

:)

A potem zastosuj uwagę powyżej - IntToStr()

0

Wybaczcie korzystam z tego forum jako ostatniej deski ratunku zwykle po wielu godzinach pisania.
Ubocznym efektem jest to ,że treść wiadomości jest trochę bez sensu.

Chodzi o właściwe formatowanie wyniku dzielenia.
Parametrem wejściowym jest liczba godzin np. 2050(godzin.)
A na wyjściu muszę otrzymać to w postaci [h,min] godziny,minuty i to najlepiej w takiej masce [hhh hhh,mm] czyli z 2050 godzin powinno być 43,10 ale ta konwersja nie daje takiego wyniku?

procedure TForm1.Button1Click(Sender: TObject);
var
Godziny,Wynik: Double;
begin
Godziny:=2050; //Liczba godzin
Wynik:=(Godziny / 60);
(Sender as TButton).Caption:=FloatToStrF(Wynik,ffNumber,8,2);
end;

0

No dobra a jak to teraz formatować aby były spacje np."hhh hhh hhh,min" tymi funkcjami to chyba tego nie zrobię.

1

Masz przykładową funkcję dla milisekund. Przerób to sobie na godziny i pokazuj jak chcesz. A zmiast funkcji jakiej ja użyłem, która korzysta z wsprintfA - możesz użyć Format, ale wtedy pamiętaj, że operujesz na zbiorach, a nie liście parametrów:

function MSecs2Time(MSec : Longint) : string;
var
  ZH, ZM, ZS : integer;
begin
  if MSec > 0 then
  begin
    ZH := MSec div 3600000;
    ZM := MSec div 60000 - ZH * 60;
    ZS := (MSec - (ZH * 3600000 + ZM * 60000)) div 1000;
    Result := FormatC('%0.2d:%0.2d:%0.2d', ZH, ZM, ZS);
  end
  else
  begin
    Result := FormatC('%0.2d:%0.2d:%0.2d', 0, 0, 0);
  end;
end;

Oczywiście jeżeli piszesz pod VCL, a nie WinAPI to użycie modułu SysUtils Tobie nie przeszkadza.

0

To jest to OK dzieki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1