Hab eine andere Funktion im Lazarus Forum gefunden, welche sicherer funktioniert.
Allerdings müsste, um vollständig zu sein, noch 2 Varianten (DezTrenner ',' TausenderTrenner '.' und umgekehrt) zusätzlich behandelt werden.
Code:
function MyStrToFloat(AString: string): double;
var
x: Double;
fs: TFormatSettings;
begin
x := NaN;
fs := FormatSettings;
fs.DecimalSeparator := ',';
fs.ThousandSeparator := ',';
if not TryStrToFloat(AString, x, fs) then begin
fs := FormatSettings;
fs.DecimalSeparator := '.';
fs.ThousandSeparator := '.';
if not TryStrToFloat(AString, x, fs) then
x := NaN;
end;
if IsNaN(x) then
Result := 0
else
Result := x;
end;
Meine CalculateStep() habe ich auch nochmals überarbeitet.
Soweit ich das bis jetzt getestet habe, funktioniert das alles auch wie gewünscht.
Es ergibt sihc für mich allerdings noch eine Frage:
Wenn ich den Wert von i prüfe (mehr als 2 Werte, genau 2 Werte, wseniger als 2 Werte) Prüft man mit einzelnen IF Statements und bricht die Funktion ab oder schachtelt man die IFs besser? Oder würde man evtl sogar auf CASE ausweichen?
Außerdem nutze ich eine Extra variable um einen Zwischenwert zu berechnen (Variable n) Da ich es so übersichtlicher finde.
Oder wäre es besser die Berechnung direkt in der Funktion sameValue() anzugeben?
Code:
function CalculateStep(Targets: array of string): double;
//Größe der Schrittweite, NaN wenn ungueltig ( wird dann mit IsNaN() geprüft )
var
i, j: integer;
m, n: double;
begin
i := Values.TargetCount; // Anzahl der Targets aus dem File
m := MyStrToFloat(Targets[1]) - MyStrToFloat(Targets[0]); // 1. Step
if i < 2 then
begin // Sollte nur ein Wert vorhanden sein,
Result := NaN; // liefert die Funktion ungültig zurück
exit;
end;
if i < 3 then // Wenn es weniger als 3 Werte gibt
begin // Dann ist der Intervall in Ordnung
Result := m; // Es wird der 1.Step zurückgeliefert
exit;
end;
for j := 2 to i - 1 do // 3 Werte oder mehr, prüfen auf gültigen Intervall
begin
n := MyStrToFloat(Targets[j]) - MyStrToFloat(Targets[j - 1]);
if not sameValue(n, m, 0) then
begin
m := NaN; // Wenn ein Intervall ungültig ist, Abbrechen und
break; // Ungültig zurückliefern
end;
end;
Result := m; // Alle Intervall OK, also Wert zurückgeben
end;
Allen ein Danke die sich die Mühe machen und gemacht haben etwas Licht in mein Programmierdunkel zu bringen.