String als Double

Für Fragen von Einsteigern und Programmieranfängern...
Andromeda
Beiträge: 120
Registriert: So 4. Jan 2015, 20:18

String als Double

Beitrag von Andromeda »

Hallo,

ich habe ein grundsätzliches Programmierproblem. In meinem Programm habe ich verschiedene Währungen als String definiert: Euro, Dollar, Bitcoin usw. Außerdem lade ich die Kurse der verschiedenen Währungen von der EZB oder anderen Internetseiten als Double herunter: KursEuro, KursDollar, KursBitcoin usw. Mein Problem ist: In einer ComboBox kann ich die verschiedenen Währungen auswählen und möchte den dazugehörigen Kurs in einem Label anzeigen. Über Stringoperationen könnte ich den String "Euro" in "KursEuro" umwandeln, aber das geht natürlich nicht so einfach, weil das eine ein String ist und das andere ein Double. Ich bräuchte also so was wie:

Code: Alles auswählen

Label.Caption := FloatToStr('Kurs' + ComboBox.text);

Ich wäre sehr dankbar, wenn mir jemand sagen würde, wie das lösen könnte.

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: String als Double

Beitrag von MacWomble »

Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Andromeda
Beiträge: 120
Registriert: So 4. Jan 2015, 20:18

Re: String als Double

Beitrag von Andromeda »

Vielen Dank für die schnelle Antwort, aber das hilft mir eigentlich nicht weiter. Die Format-Funktion benötigt ja auch einen Double-Wert, ich habe aber einen String-Wert.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2809
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: String als Double

Beitrag von m.fuchs »

Irgendwie kommt nicht so ganz herüber, was du eigentlich möchtest.

Gib doch mal ein konkretes Beispiel an: Was für Variablen hast du? Welche Werte enthalten sie? Was soll rauskommen?
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: String als Double

Beitrag von MacWomble »

:shock:

Code: Alles auswählen

Label.Caption := 'Kurs' + ComboBox.text;
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Jole
Beiträge: 114
Registriert: Fr 4. Jul 2014, 14:39
OS, Lazarus, FPC: Linux
CPU-Target: amd64

Re: String als Double

Beitrag von Jole »

Wenn ich das richtig verstanden habe meinst du das so:

Code: Alles auswählen

 
Label.Caption:= ComboBox.Text+ FloatToStr (Kurs);
 
Oder?

Andromeda
Beiträge: 120
Registriert: So 4. Jan 2015, 20:18

Re: String als Double

Beitrag von Andromeda »

Da habe ich mich wohl schlecht ausgedrückt. Tut mir leid.
Euro ist ein String. KursEuro ist ein Double. Wenn ich also schreibe

Code: Alles auswählen

Label.Caption := 'Kurs' + ComboBox.text;
dann steht das zwar die richtige Bezeichnung (KursEuro), aber ich möchte ja nicht den String ausgeben (also KursEuro als Text), sondern den Wert von KursEuro (das ist ein Double).

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2809
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: String als Double

Beitrag von m.fuchs »

Gib doch mal ein konkretes Beispiel an: Was für Variablen hast du? Welche Werte enthalten sie? Was soll rauskommen?
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Andromeda
Beiträge: 120
Registriert: So 4. Jan 2015, 20:18

Re: String als Double

Beitrag von Andromeda »

ich habe einen String "Dollar" und ich habe einen Double "KursDollar" und in einem Label möchte ich den Wert von KursDollar ausgeben. Die Kurse habe ich heruntergeladen, so dass KursDollar (double) 1,1241 beträgt. Wenn ich jetzt in meiner ComboBox "Dollar" auswähle, soll in meinem Label 1,1241 erscheinen. Ich hoffe, das ist jetzt verständlicher.

Wenn ich schreibe

Code: Alles auswählen

Label.Caption := 'Kurs' + ComboBox.text;
dann steht in meinem Label "KursDollar" statt "1,1241".

Und wenn ich schreibe

Code: Alles auswählen

Label.Caption := FloatToStr('Kurs' + ComboBox.text);
dann sagt der Compiler: du hast einen String übergeben, statt einem Double, oder so ähnlich.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2809
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: String als Double

Beitrag von m.fuchs »

Aha, du meinst also sowas:

Code: Alles auswählen

var
  KursDollar: Double = 1.123;
  KursYen: Double = 1.145;
 
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  if ComboBox1.Text = 'Dollar' then
    Label1.Caption := FloatToStr(KursDollar)
  else if ComboBox1.Text = 'Yen' then
    Label1.Caption := FloatToStr(KursYen);
end;
Was du aber eigentlich möchtest, ist dir das riesenlange if-Statement zu ersparen. Da fallen mir spontan zwei Möglichkeiten ein.
  • Du baust dir eine passende Map zusammen und befüllst sie mit den Währungsnamen und Kurse:

    Code: Alles auswählen

     
    type
      TKursMap = specialize TFPGMap<String, Double>;
    (* ... *)
    var
      KursMap: TKursMap;
    (* ... *)
    KursMap.Add('Dollar', 1.1241);
    KursMap.Add('Yen', 1.55);      
     
    Die Ausgabe erfolgt dann mit:

    Code: Alles auswählen

    Label1.Caption := FloatToStr(KursMap.KeyData[ComboBox1.Text]);
    (Code zur Absicherung fehlt noch)
  • Oder du baust dir eine Klasse, welche den Kurs enthält und bindest davon Objekte an den jeweiligen Combobox-Eintrag.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Andromeda
Beiträge: 120
Registriert: So 4. Jan 2015, 20:18

Re: String als Double

Beitrag von Andromeda »

vielen Dank. Jetzt hat wenigstens mal jemand mein Problem verstanden. Genau, ich wollte mir das riesenlange if-Statement ersparen. Aber für einen Anfänger ist das wahrscheinlich trotzdem noch die beste Lösung, obwohl es ungefähr 80 Währungen sind. Das mit der Klasse erscheint mir zu schwierig für mich. Das mit der Map werde ich mal probieren. Das wäre eigentlich eine gute Lösung. Ich weiß nur nicht, ob ich das schaffe.

Ich hatte gehofft, es gibt vielleicht eine Lösung in der Art:

Code: Alles auswählen

Label.Caption := FloatToStr(Wertvon('Kurs' + ComboBox.text));
Zuletzt geändert von Andromeda am Do 23. Jun 2016, 10:38, insgesamt 1-mal geändert.

Jole
Beiträge: 114
Registriert: Fr 4. Jul 2014, 14:39
OS, Lazarus, FPC: Linux
CPU-Target: amd64

Re: String als Double

Beitrag von Jole »

Andromeda hat geschrieben: Ich hatte gehofft, es gibt vielleicht eine Lösung in der Art:
Label.Caption := FloatToStr(Wertvon ('Kurs' + ComboBox.text));
Dein Denkfehler liegt darin, dass du versuchst einen String in die FloatToStr() Prozedur zu bringen. Da gehört nur deine Double Variable rein und sonst nix.
Beispiel:

Code: Alles auswählen

 
Label.Caption:= FloatToStr (Kurswert)+ ' - Kurs '+ ComboBox.Text;
 

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Re: String als Double

Beitrag von Euklid »

Andromeda hat geschrieben:Ich hatte gehofft, es gibt vielleicht eine Lösung in der Art:

Code: Alles auswählen

Label.Caption := FloatToStr(Wertvon('Kurs' + ComboBox.text));
FloatToStr wandelt eine Zahl in einen String um.

Umgekehrt:
StrToFloat wandelt einen String in einen Real-Typ um (d.g. real, double, extended, etc).

D.h. wenn Du eine Zahl aus einem Textfeld einlesen willst, brauchst Du den Befehl StrToFloat. Umgekehrt, möchtest Du eine Zahl als Text ausgeben, brauchst Du FloatToStr :)

- Euklid

Andromeda
Beiträge: 120
Registriert: So 4. Jan 2015, 20:18

Re: String als Double

Beitrag von Andromeda »

80 mal if ... then ... schreiben, ist ja nicht besonders elegant. Jetzt ist mir eingefallen, ob ich das nicht vielleicht mit einer Function machen könnte. Aber ich habe noch nie mit functionen gearbeitet, daher weiß ich nicht, ob das geht.

Mathias
Beiträge: 6912
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: String als Double

Beitrag von Mathias »

Aber ich habe noch nie mit functionen gearbeitet, daher weiß ich nicht, ob das geht.
Functionen sehen so aus : http://wiki.freepascal.org/Function
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten