AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Vergleich von Zahlen

Ein Thema von Beach · begonnen am 3. Mär 2020 · letzter Beitrag vom 6. Mär 2020
 
Beach

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

AW: Vergleich von Zahlen

  Alt 4. Mär 2020, 09: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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:30 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz