Thema: FreePascal Vergleich von Zahlen

Einzelnen Beitrag anzeigen

Beach

Registriert seit: 3. Mär 2019
Ort: Kappel
46 Beiträge
 
FreePascal / Lazarus
 
#13

AW: Vergleich von Zahlen

  Alt 4. Mär 2020, 10:04
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.
MfG Jürgen
  Mit Zitat antworten Zitat