Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Variable als Float definieren (https://www.delphipraxis.net/170984-variable-als-float-definieren.html)

Don Muhkuh 13. Okt 2012 21:08


Variable als Float definieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo liebe Community,

das ist mein erster Post und ich habe ein Problem:

Ich will einen Währungsumrechner erstellen.
Dafür geb ich jeder Währung einen Wert, der für ihn steht, aber mein Problem ist,
dass man (meiner Erkenntnissen nach) Variablen nicht mit Float angeben kann (Die Wärungen haben einen Komma-Wert).
Dann habe ich probiert, die Zahlen einfach zu erhöhen (alle * 100000), um keine Komma-Zahlen zu bekommen.
Da ergab sich aber das Problem, dass die Ergebnisse keine Nachkommastellen hatten. :|

Hier ist der Code:

Delphi-Quellcode:
unit mWaehrungen;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, Buttons, Mask, Grids;

type
  TFWaehrungen = class(TForm)
    ImHintergrund: TImage;
    Bt1AusD: TBitBtn;
    Bt1Euro: TBitBtn;
    Bt1Fr: TBitBtn;
    Bt1KanD: TBitBtn;
    Bt1Peso: TBitBtn;
    Bt1Pfund: TBitBtn;
    Bt1Real: TBitBtn;
    Bt1USD: TBitBtn;
    Bt1Yen: TBitBtn;
    Bt1Yuan: TBitBtn;
    Bt1Zlo: TBitBtn;
    Bt2AusD: TBitBtn;
    Bt2Euro: TBitBtn;
    Bt2Fr: TBitBtn;
    Bt2KanD: TBitBtn;
    Bt2Peso: TBitBtn;
    Bt2Pfund: TBitBtn;
    Bt2Real: TBitBtn;
    Bt2USD: TBitBtn;
    Bt2Yen: TBitBtn;
    Bt2Yuan: TBitBtn;
    Bt2Zlo: TBitBtn;
    Ed1Laender: TLabeledEdit;
    Ed2Laender: TLabeledEdit;
    LiW1: TListBox;
    LiL1: TListBox;
    LiW2: TListBox;
    LiL2: TListBox;
    LiW3: TListBox;
    LiL3: TListBox;
    BtNachSeite: TButton;
    BtVorSeite: TButton;
    LaKurs: TLabel;
    LaAnfang: TLabel;
    LaEnde: TLabel;
    LaWEnde1: TLabel;
    LaWEnde2: TLabel;
    EdWaehrungA: TEdit;
    EdKurs: TEdit;
    EdWaehrungB: TEdit;
    BtTauschen: TButton;
    LaWAnfang: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure BtVorSeiteClick(Sender: TObject);
    procedure BtNachSeiteClick(Sender: TObject);
    procedure Bt1EuroClick(Sender: TObject);
    procedure Bt2EuroClick(Sender: TObject);
    procedure Bt1USDClick(Sender: TObject);
    procedure Bt2USDClick(Sender: TObject);
    procedure Bt1PfundClick(Sender: TObject);
    procedure Bt2PfundClick(Sender: TObject);
    procedure Bt1FrClick(Sender: TObject);
    procedure Bt2FrClick(Sender: TObject);
    procedure Bt1ZloClick(Sender: TObject);
    procedure Bt2ZloClick(Sender: TObject);
    procedure Bt1KanDClick(Sender: TObject);
    procedure Bt2KanDClick(Sender: TObject);
    procedure Bt1AusDClick(Sender: TObject);
    procedure Bt2AusDClick(Sender: TObject);
    procedure Bt1YenClick(Sender: TObject);
    procedure Bt2YenClick(Sender: TObject);
    procedure Bt1YuanClick(Sender: TObject);
    procedure Bt2YuanClick(Sender: TObject);
    procedure Bt1PesoClick(Sender: TObject);
    procedure Bt2PesoClick(Sender: TObject);
    procedure Bt1RealClick(Sender: TObject);
    procedure Bt2RealClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  FWaehrungen: TFWaehrungen;
  Waehrung_A, Waehrung_B: Integer;
  Seite: Byte;

implementation

{$R *.dfm}

procedure TFWaehrungen.FormCreate(Sender: TObject);
begin
  With ImHintergrund.Canvas Do
    begin
    Brush.Color := clGreen;
    Rectangle(0, 0, 800, 100);
    Brush.Color := clHighlight;
    Rectangle(0, 100, 800, 400);
    Brush.Color := clGreen;
    Rectangle(0, 400, 800, 500);
    end;
  Waehrung_A := 100000;
  Waehrung_B := 100000;
  Seite := 1;
  LiL2.Visible := False;
  LiW2.Visible := False;
  LiL3.Visible := False;
  LiW3.Visible := False;
  BtVorSeite.Enabled := False;
end;

procedure TFWaehrungen.BtVorSeiteClick(Sender: TObject);
begin
  Seite := Seite - 1;
  If Seite = 1 Then
    begin
    BtVorSeite.Enabled := False;
    BtNachSeite.Enabled := True;
    LiL1.Visible := True;
    LiW1.Visible := True;
    LiL2.Visible := False;
    LiW2.Visible := False;
    LiL3.Visible := False;
    LiW3.Visible := False;
    end;
  If Seite = 2 Then
    begin
    BtVorSeite.Enabled := True;
    BtNachSeite.Enabled := True;
    LiL1.Visible := False;
    LiW1.Visible := False;
    LiL2.Visible := True;
    LiW2.Visible := True;
    LiL3.Visible := False;
    LiW3.Visible := False;
    end;
end;

procedure TFWaehrungen.BtNachSeiteClick(Sender: TObject);
begin
  Seite := Seite + 1;
  If Seite = 2 Then
    begin
    BtVorSeite.Enabled := True;
    BtNachSeite.Enabled := True;
    LiL1.Visible := False;
    LiW1.Visible := False;
    LiL2.Visible := True;
    LiW2.Visible := True;
    LiL3.Visible := False;
    LiW3.Visible := False;
    end;
  If Seite = 3 Then
    begin
    BtVorSeite.Enabled := True;
    BtNachSeite.Enabled := False;
    LiL1.Visible := False;
    LiW1.Visible := False;
    LiL2.Visible := False;
    LiW2.Visible := False;
    LiL3.Visible := True;
    LiW3.Visible := True;
    end;
end;

procedure TFWaehrungen.Bt1EuroClick(Sender: TObject);
begin
  Waehrung_A := 100000;
  EdWaehrungB.Text := FloatToStr(StrToFloat(EdWaehrungA.Text) * (Waehrung_B Div Waehrung_A));
  EdKurs.Text := FloatToStr(Waehrung_B Div Waehrung_A);
  LaWAnfang.Caption := 'Euro (Europa)';
  LaKurs.Caption := '1 Euro (Europa) =';
  LaKurs.Left := 190 - LaKurs.Width;
end;

procedure TFWaehrungen.Bt2EuroClick(Sender: TObject);
begin
  Waehrung_B := 100000;
  EdWaehrungB.Text := FloatToStr(StrToFloat(EdWaehrungA.Text) * (Waehrung_B Div Waehrung_A));
  EdKurs.Text := FloatToStr(Waehrung_B Div Waehrung_A);
  LaWEnde1.Caption := 'Euro (Europa)';
  LaWEnde2.Caption := 'Euro (Europa)';
end;

procedure TFWaehrungen.Bt1USDClick(Sender: TObject);
begin
  Waehrung_A := 129373;
  EdWaehrungB.Text := FloatToStr(StrToFloat(EdWaehrungA.Text) * (Waehrung_B Div Waehrung_A));
  EdKurs.Text := FloatToStr(Waehrung_B Div Waehrung_A);
  LaWAnfang.Caption := 'Dollar (Vereinigte Staaten)';
  LaKurs.Caption := '1 Dollar (Vereinigte Staaten) =';
  LaKurs.Left := 190 - LaKurs.Width;
end;

procedure TFWaehrungen.Bt2USDClick(Sender: TObject);
begin
  Waehrung_B := 129373;
  EdWaehrungB.Text := FloatToStr(StrToFloat(EdWaehrungA.Text) * (Waehrung_B Div Waehrung_A));
  EdKurs.Text := FloatToStr(Waehrung_B Div Waehrung_A);
  LaWEnde1.Caption := 'Dollar (Vereinigte Staaten)';
  LaWEnde2.Caption := 'Dollar (Vereinigte Staaten)';
end;

procedure TFWaehrungen.Bt1PfundClick(Sender: TObject);
begin
  Waehrung_A := 80755;
  EdWaehrungB.Text := FloatToStr(StrToFloat(EdWaehrungA.Text) * (Waehrung_B Div Waehrung_A));
  EdKurs.Text := FloatToStr(Waehrung_B Div Waehrung_A);
  LaWAnfang.Caption := 'Pfund (Großbritannien)';
  LaKurs.Caption := 'Pfund (Großbritannien) =';
  LaKurs.Left := 190 - LaKurs.Width;
end;

procedure TFWaehrungen.Bt2PfundClick(Sender: TObject);
begin
  Waehrung_B := 80755;
  EdWaehrungB.Text := FloatToStr(StrToFloat(EdWaehrungA.Text) * (Waehrung_B Div Waehrung_A));
  EdKurs.Text := FloatToStr(Waehrung_B Div Waehrung_A);
  LaWEnde1.Caption := 'Pfund (Großbritannien)';
  LaWEnde2.Caption := 'Pfund (Großbritannien)';
end;

.
.
.

end.
Und noch andere Währungen (Das ist nur das Schema).

Wie bekomme ich jetzt Komma-Zahlen als Ergebnis,
wenn ich keine Variablen als Float definieren kann
und das Ergebnis (Waehrung_B Div Waehrung_A) anscheinend auch nur als Integer gewertet wird?
(Waehrung_A und Waehrung_B sind das einzige Problem,
sonst funktioniert alles.)
Danke im Vorraus :-D

P.S.: Eine Bild des Programms ist bei den Anhängen. Den rechten Teil bitte ignorieren, das wird erst später eingebaut.

Mit freundlichen Grüßen, Don Muhkuh

Popov 13. Okt 2012 21:14

AW: Variable als Float definieren
 
Für Währungen gibt es extra ein Variablentyp, das ist der Currency.

Im Gegensatz zu anderen Realtypen hat er keine Rundungsfehler. Das ist wie ein Integer mit vier Nachkommastellen.

Sir Rufo 13. Okt 2012 21:49

AW: Variable als Float definieren
 
Es gibt für Fließkommazahlen aber auch
Delphi-Quellcode:
double, single, extended
um ein paar zu nennen.
Der Currency Typ ist intern ein Int64 wo die letzten vier Stellen als Nachkommastellen betrachtet werden. Ist aber soweit egal, denn das passiert intern. Bei kleinen Werten und Währungen mit großem Umrechnungsfaktor kann allerdings beim Umrechnen auch mal 0,0000 herauskommen.

Nimmt man die anderen Typen (z.B. Extended) wird es auch nicht viel besser, denn hier kommen auch noch üble Rechenungenauigkeiten rein (liegt an der internen Abbildung der Werte)

Man sollte es wissen, um sich darauf einstellen zu können, welchen Tod man stirbt.

Buchhaltärisch reicht Currency (in 90% der Fälle) völlig aus, allerdings werden dort auch beide Werte (In Fremd- und Buchwährung) gespeichert ;)

nuclearping 13. Okt 2012 21:54

AW: Variable als Float definieren
 
Zitat:

Zitat von Don Muhkuh (Beitrag 1186937)
Wie bekomme ich jetzt Komma-Zahlen als Ergebnis,
wenn ich keine Variablen als Float definieren kann
und das Ergebnis (Waehrung_B Div Waehrung_A) anscheinend auch nur als Integer gewertet wird?

Und warum kannst du keine Variablen als "Float" definieren? Den Datentyp "Float" gibt es nicht, ja. Dafür aber ein Haufen andere, die das bieten, was du suchst: Double, Real, Single, Extended. War das etwa schon das Problem? :stupid:

Don Muhkuh 13. Okt 2012 22:03

AW: Variable als Float definieren
 
Danke für die schnelle Antwort, aber welchen Befehl (bzw. veränderte Form von FloatToStr und StrToFloat) muss ich benutzen?

Sir Rufo 13. Okt 2012 22:13

AW: Variable als Float definieren
 
Zitat:

Zitat von Don Muhkuh (Beitrag 1186945)
Danke für die schnelle Antwort, aber welchen Befehl (bzw. veränderte Form von FloatToStr und StrToFloat) muss ich benutzen?

Häh? Schau doch mal nach, was Delphi-Referenz durchsuchenStrToFloat bzw. Delphi-Referenz durchsuchenFloatToStr rausgibt - oh, es gibt eine Doku

Popov 13. Okt 2012 22:25

AW: Variable als Float definieren
 
An für sich ist es nett, dass man einen Anfänger drauf hinweist, dass es auch Double, Real, Single, Extended Typen gibt, aber wenn er von Währungen spricht, wozu die Info? Das ist wie einem der in der Wüste kurz vor dem verdursten steht und "Wasser" ruft, zu antworten "Ich hätte das Apollinaris, Volvic, Fiji Water, Staatlich Fachingen und Perrier. Welches möchten sie den haben?".

Don Muhkuh 13. Okt 2012 22:27

AW: Variable als Float definieren
 
Da kommt dann der der Fehler, dass der Operator auf den Operandentypen nicht anwendbar sei. :?

Popov 13. Okt 2012 22:33

AW: Variable als Float definieren
 
Glaube ich nicht.
Delphi-Quellcode:
var
  Geld: Currency;
  Str: String;
begin
  Geld := 123456789.1234;
  ShowMessage(FloatToStr(Geld));

  Str := '123456789,1234'; //hier Komma
  Geld := StrToFloat(Str);
  ShowMessage(FloatToStr(Geld));
end;

Sir Rufo 13. Okt 2012 22:35

AW: Variable als Float definieren
 
Logisch, denn DIV geht nur bei Integer ;)

Nimm stattdessen /


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:37 Uhr.
Seite 1 von 2  1 2      

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