String als Double
- 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
Das ist ja alles schön und gut, löst aber nicht das eigentliche Problem. Dem OP geht es nicht um die Arbeitsweise von Funktionen oder wie die Float-Umwandlung funktioniert. Er möchte eine Liste von Strings einer Liste von Doubles zuordnen.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
-
- 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
Dann könnte man doch eine TList nehmen.Er möchte eine Liste von Strings einer Liste von Doubles zuordnen.
Oder einfach einen Array of Record.
Das einfachste für solche Sachen sind halt immer noch Classen, so wie es weiter oben beschrieben ist.
Sieht komplizierter aus als es ist.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
Re: String als Double
Ich weiß nicht, wie die Daten von der EZB bei dir vorliegen. Ich nehme mal an, dir liegt eine Datei vor, in der die Währungsbezeichnungen in einer Spalte stehen und daneben die aktuellen Kurswerte. Um das in einem Programm umzusetzen würde ich einen Record definieren, der Währungsbezeichnung und Kurs in einer Größe zusammenpackt, und all diese Records in einem Array, zum Beispiel, (das ist anfängergerechter als eine TList). Dann durchläufst du in einer Schleife alle Records und siehst nach, ob die Währung des aktuell gewählten Records der gesuchten entspricht - die Schleife ersetzt dir sozusagen die 80 if's.
Etwa so (nicht getestet, Fehler möglich) - ich hoffe mal, dass das keine Hausaufgabe ist...:
Etwa so (nicht getestet, Fehler möglich) - ich hoffe mal, dass das keine Hausaufgabe ist...:
Code: Alles auswählen
type
TWaehrung = record
Name: String;
Kurs: Double;
end;
var
Waehrungen: array of TWaehrung;
function KursSuchen(EineWaehrung: String): Double;
var
i: Integer;
begin
for i:=0 to High(Waehrungen) do
if Waehrungen[i].Name = EineWaehrung then begin
Result := Waehrungen[i].Kurs;
exit;
end;
Result := -1; // soll anzeigen, dass die Währung nicht gefunden wurde.
end;
procedure TForm1.Combobox1Change(Sender: TObject);
var
Kurs: Double;
begin
kurs := KursSuchen(Combobox1.Text);
if kurs = -1 then
Label1.Caption := 'Währung nicht gefunden'
else
Label1.Caption := FloatToStr(kurs);
end;
-
- Beiträge: 69
- Registriert: Sa 5. Dez 2015, 20:03
- OS, Lazarus, FPC: Win10 IDE 1.6
- CPU-Target: 64Bit
- Wohnort: Leipzig
Re: String als Double
Wie jetzt....Kurse von der EZB laden können aber bei ner Funktion hört es auf??
-
- 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
Kennst Du das CASE-OF-Statement? Es ist extra geschaffen worden, um viele if-Abfragen elegant zu lösen - passt also vielleicht genau für Dein ProblemAndromeda hat geschrieben:80 mal if ... then ... schreiben, ist ja nicht besonders elegant.

Schau mal hier:
http://www.freepascal.org/docs-html/ref/refsu57.html
Gib einfach Bescheid, wenn Du ein konkretes Beispiel brauchst.
- Euklid
Re: String als Double
vielen Dank. Ja, das mit CASE-OF habe ich mir angeschaut. Das scheint auch eine gute Möglichkeit zu sein. Aber noch lieber wäre mir eine Function, die mir aus dem Namen der Währung (das ist ein String, wie Euro, Dollar, Yen usw.) den Kurs (das ist ein Double, wie KursEuro, KursDollar, KursYen usw.) liefert. Ich habe in meinem Programm 80 Strings mit den Namen der Währungen und 80 Doubles mit den Kursen der entsprechenden Währungen. Da die Bezeichnungen der Doubles sich nur durch den Vorsatz "Kurs" von den Namen unterscheiden, müsste das meiner Meinung nach möglich sein, aber geschafft habe ich das bis jetzt noch nicht. Mit Listen oder Maps zu arbeiten, ist sicherlich auch möglich, aber da die Kurse im Minutenabstand aktualisiert werden und von vielen verschiedenen Quellen (nicht nur von der EZB, sondern auch von europäischen, amerikanischen und chinesischen Börsen) stammen, wahrscheinlich etwas umständlich. Jede Börse liefert mir ja nur einen kleinen Teil der Werte, die in der Liste enthalten sind.
- 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
Kann man machen, intern würde ich die Werte in einer Map speichern und von dort auslesen.Andromeda hat geschrieben:Aber noch lieber wäre mir eine Function, die mir aus dem Namen der Währung (das ist ein String, wie Euro, Dollar, Yen usw.) den Kurs (das ist ein Double, wie KursEuro, KursDollar, KursYen usw.) liefert.
Viel zu kompliziert. Ob man in Freepascal auf die Variablennamen überhaupt zugreifen kann weiß ich nicht einmal, wenn ist es recht aufwändig (Stichwort: RTTI). Die Map ist da die einfache Variante.Andromeda hat geschrieben:Ich habe in meinem Programm 80 Strings mit den Namen der Währungen und 80 Doubles mit den Kursen der entsprechenden Währungen. Da die Bezeichnungen der Doubles sich nur durch den Vorsatz "Kurs" von den Namen unterscheiden, müsste das meiner Meinung nach möglich sein, aber geschafft habe ich das bis jetzt noch nicht.
Im Gegenteil, wenn du die zentrale Map hast dann können deine einzelnen Programmteile auch problemlos nur die Kurse updaten, die sie kennen. Zugriff erfolgt ja über den Key, also den Währungsnamen. Es kristallisiert sich für mich immer mehr heraus: die Map ist die beste Lösung für dein Problem.Andromeda hat geschrieben:Mit Listen oder Maps zu arbeiten, ist sicherlich auch möglich, aber da die Kurse im Minutenabstand aktualisiert werden und von vielen verschiedenen Quellen (nicht nur von der EZB, sondern auch von europäischen, amerikanischen und chinesischen Börsen) stammen, wahrscheinlich etwas umständlich. Jede Börse liefert mir ja nur einen kleinen Teil der Werte, die in der Liste enthalten sind.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
-
- Beiträge: 106
- Registriert: Mi 3. Feb 2016, 09:39
- OS, Lazarus, FPC: Linux(Arch Linux(+ARM)/Minibian) (L 1.6.0 FPC 3.0.0)
- CPU-Target: 32/64Bit,ARM(RPi)
- Wohnort: nahe Grimma
Re: String als Double
Hallo Andromeda,
ich habe gerade nochmal durchs Netz geschaut. Bei der Suche nach verschiedenen Stichworten kam mir irgendwann eine INI-Datei in den Sinn.
Jetzt weiß ich allerdings nicht in welcher vorm du die jeweiligen Kurse erhälst. Da müsste man dann schauen ob man die INI entsprechend automatisch aktualisieren kann (möglich ist das mit Sicherheit, nur der Aufwand ist fraglich).
Also meine Idee:
Kurse.ini:
im Programm rufst du den Wert dann mit auf.
ich habe gerade nochmal durchs Netz geschaut. Bei der Suche nach verschiedenen Stichworten kam mir irgendwann eine INI-Datei in den Sinn.
Jetzt weiß ich allerdings nicht in welcher vorm du die jeweiligen Kurse erhälst. Da müsste man dann schauen ob man die INI entsprechend automatisch aktualisieren kann (möglich ist das mit Sicherheit, nur der Aufwand ist fraglich).
Also meine Idee:
Kurse.ini:
Code: Alles auswählen
[Kurse]
Dollar=x,xx
Yen=x,xx
Euro=x,xx
Code: Alles auswählen
Inifile.ReadFloat('Kurse', CmbKurse.Text, 0); //gibts das im Laz? Ansonsten ReadString und dann konvertieren
Mfg Requion
Das beste an Standards ist, dass es so viele davon gibt.
Das beste an Standards ist, dass es so viele davon gibt.
Re: String als Double
Ok, das sehe ich ein. Du hast mir ja praktisch schon den ganzen Quellcode für das Erstellen einer Map aufgezeigt. Im Grunde scheint mir zwischen einer Map und einer Listview kein großer Unterschied zu sein. Das müsste ich hinbekommen.
Edit: Diese Antwort war für m.fuchs bestimmt.
Edit: Diese Antwort war für m.fuchs bestimmt.
Re: String als Double
Wahrscheinlich ist es besser, ich schildere mal, was ich in meinem Programm machen möchte. Vielleicht hat dann jemand eine Idee, wie man das am besten lösen könnte. Ich habe eine antizyklische Tradingmethode entwickelt, die ich mit meinem Programm realisieren möchte. Im Programm werden insgesamt etwa 80 Werte berücksichtigt, dazu gehören die ganzen Fiatwährungen, wie Euro, Dollar, Yen usw., dann die Kryptowährungen, wie Bitcoin, Ethereum, NEM usw und zuletzt auch noch wichtige andere Werte, wie Gold- und Ölpreis . Die Fiatwährungen werden einmal täglich um 14 Uhr 15 von der EZB heruntergeladen. Dollar und andere wichtige Fiatwährungen zusätzlich noch alle halbe Stunde von der Forex. Die Kryptowährungen lade ich von allen gängigen europäischen, amerikanischen und chinesischen Börsen herunter. Der Kurs wird je nach Umsatz an der jeweiligen Börse gewichtet, so dass ein möglichst realistischer Durchschnittskurs errechnet werden kann. Das Aktualisierungsintervall kann im Programm von 1 Minute bis zu 1 Stunde eingestellt werden. Das alles ist schon fertig, funktioniert und liefert mir für jeden der 80 Werte den aktuellen, umsatzgewichteten Kurs als Double (KursDollar, KursYen, KursBitcoin usw.).
Für die antizyklische Handelsstrategie kann man aus ebenfalls 80 (fast gleichnamigen) Werten bis zu 10 Werte auswählen, die dann ständig angezeigt und mit denen die eigentlichen Handelsberechnungen durchgeführt werden. Diese Werte liegen als String vor und dafür brauche ich die Verbindung zu den Doubles. In 10 ComboBoxen kann man die gewünschten Währungen auswählen und dabei sollen natürlich die aktuellen Kurse übernommen werden. Das ist mein ganzes Problem: ich wähle in der ComboBox eine Währung aus, die mir als String (Euro, Dollar, Yen usw.) vorliegt und möchte den entsprechenden Double (KursEuro, KursDollar, KursYen usw.) erhalten. Natürlich sollen diese Werte bei jeder Aktualisierung der Börsen ständig ebenfalls aktualisiert werden.
Bei dem Vorschlag von m.fuchs mit den Maps müsste ich also ständig die Map aktualisieren, und bis jetzt weiß ich nicht, wie so etwas geht. Deshalb erschien es mir einfacher, ich könnte bei der Auswahl "Dollar" irgendwie den Wert von "KursDollar" nachschlagen.
Mir wäre natürlich auch mit dem Umgekehrten geholfen, wenn ich also die Bezeichnungen für die Doubles KursEuro, KursDollar, KursYen usw. in Strings Euro, Dollar, Yen usw. umwandeln könnte, um damit die Liste für die ComboBoxen zu generieren.
Für die antizyklische Handelsstrategie kann man aus ebenfalls 80 (fast gleichnamigen) Werten bis zu 10 Werte auswählen, die dann ständig angezeigt und mit denen die eigentlichen Handelsberechnungen durchgeführt werden. Diese Werte liegen als String vor und dafür brauche ich die Verbindung zu den Doubles. In 10 ComboBoxen kann man die gewünschten Währungen auswählen und dabei sollen natürlich die aktuellen Kurse übernommen werden. Das ist mein ganzes Problem: ich wähle in der ComboBox eine Währung aus, die mir als String (Euro, Dollar, Yen usw.) vorliegt und möchte den entsprechenden Double (KursEuro, KursDollar, KursYen usw.) erhalten. Natürlich sollen diese Werte bei jeder Aktualisierung der Börsen ständig ebenfalls aktualisiert werden.
Bei dem Vorschlag von m.fuchs mit den Maps müsste ich also ständig die Map aktualisieren, und bis jetzt weiß ich nicht, wie so etwas geht. Deshalb erschien es mir einfacher, ich könnte bei der Auswahl "Dollar" irgendwie den Wert von "KursDollar" nachschlagen.
Mir wäre natürlich auch mit dem Umgekehrten geholfen, wenn ich also die Bezeichnungen für die Doubles KursEuro, KursDollar, KursYen usw. in Strings Euro, Dollar, Yen usw. umwandeln könnte, um damit die Liste für die ComboBoxen zu generieren.
- 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
Ehrlich gesagt verstehe ich deine Schwierigkeiten nicht. Wenn du Variablen verändern kannst, dann kannst du doch auch die Werte einer Map verändern.
Hier nochmal zusammengefasst:
Definition der Map:
Map beim Programmstart initialisieren:
Du lässt dir den Wert des Pfund ausgeben:
Label1 zeigt jetzt 1.51 an.
Nun, tritt eine Veränderung ein. Beispielsweise stimmen 51,89 Prozent der Wähler für einen Brexit.
Du lässt dir wieder den Wert des Pfund ausgeben:
Label1 zeigt jetzt 1.19 an.
Noch Fragen? Dann fragen
Ach ja, für die Nutzung der Maps musst du die Unit fgl einbinden.
Hier nochmal zusammengefasst:
Definition der Map:
Code: Alles auswählen
type
TKursMap = specialize TFPGMap<String, Double>;
var
KursMap: TKursMap;
Code: Alles auswählen
Kursmap := TKursMap.Create;
KursMap.Add('Dollar', 1.444);
KursMap.Add('Pfund', 1.51);
Code: Alles auswählen
Label1.Caption := FloatToStr(KursMap.KeyData['Pfund']);
Nun, tritt eine Veränderung ein. Beispielsweise stimmen 51,89 Prozent der Wähler für einen Brexit.
Code: Alles auswählen
KursMap.KeyData['Pfund'] := 1.19;
Code: Alles auswählen
Label1.Caption := FloatToStr(KursMap.KeyData['Pfund']);
Noch Fragen? Dann fragen

Ach ja, für die Nutzung der Maps musst du die Unit fgl einbinden.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
Re: String als Double
Ok, Du hast mich überzeugt. Ich werde das jetzt mit der Map machen. Vielen dank.
Re: String als Double
ich habe das jetzt mit der Map gemacht und es funktioniert wunderbar, auch die Aktualisierung und Abfrage der Werte. Das ist genau die richtige Lösung. Nochmals vielen Dank. Ohne Deine Hilfe hätte ich das nie hingebracht. Weiter oben hast Du kurz erwähnt, dass man noch Fehler abfangen sollte. An was hast Du dabei gedacht?
- 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
Wenn du auf einen Key zugreifst der nicht existiert, wirft dein Programm eine Exception. Zur Absicherung kann man folgendes machen:Andromeda hat geschrieben:Weiter oben hast Du kurz erwähnt, dass man noch Fehler abfangen sollte. An was hast Du dabei gedacht?
Code: Alles auswählen
if KursMap.IndexOf('Dollar') > -1 then
Label1.Caption := FloatToStr(KursMap.KeyData['Dollar'])
else
Label1.Caption := 'not found';
Beim Updaten der Werte muss du das nicht machen, hier wird bei ein Zugriff auf einen fehlenden Key dieser automatisch angelegt.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
-
- Beiträge: 321
- Registriert: Sa 11. Jun 2016, 12:16
- OS, Lazarus, FPC: Linux Mint 18.1 L1.6.2-1 FPC 3.0.0
- CPU-Target: 64Bit
- Wohnort: Konstanz
Re: String als Double
Du könntest eine "switch : case" -Lösung verwenden:
http://wiki.freepascal.org/Case/de
http://wiki.freepascal.org/Case/de