![]() |
AW: Vergleich von Zahlen
So?
Delphi-Quellcode:
Nur nebenbei:
type
TValues=Array of Double; FUNCTION CheckRegularity(Values:TValues):Boolean; var I:Integer; Delta:Double; begin Result:=True; if Length(Values)>2 then begin Delta:=Values[1]-Values[0]; for I:=1 to Length(Values)-2 do if not SameValue(Values[I+1]-Values[I],Delta) then begin Result:=False; Exit; end; end; end; In #1 schreibst du Zitat:
Haben die Daten 6 Nachkommastellen oder können sie auch Nachkommastellen enthalten. |
AW: Vergleich von Zahlen
Wow. Viel Input...
Danke euch dafür. Zitat:
Zitat:
Zitat:
Hatte ich aus den Augen verloren und muss ich mich nochmals mit beschäftigen. Zitat:
Wenn der Vergleich das erstemal UNWAHR ist muss ich abbrechen weil dann ja eigentlich die Bedingung, alle Werte im gleichen Intervall, bereits UNWAHR ist und ich auch gar nicht mehr weiter prüfen brauch. Zitat:
Ich versuche es konkreter: Das Format mit den 6 Nachkommastellen steht so fest. Die Werte werden meistens aber nur ganzzahlig sein. Also mit 6x 0 hinter dem Dezimalpunkt. Beispiel: 100.000000 Es könnte aber auch sein das ich keine ganzzahligen Werte habe. Als Beispiel 100,5 was dann als 100.500000 in den Daten dargestellt wird. Daher muss ich wohl mit Fließkommazahlen arbeiten. |
AW: Vergleich von Zahlen
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:
Meine CalculateStep() habe ich auch nochmals überarbeitet.
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; 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:
Allen ein Danke die sich die Mühe machen und gemacht haben etwas Licht in mein Programmierdunkel zu bringen.
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; |
AW: Vergleich von Zahlen
Zitat:
Da sich sowas nicht ändert und man das öfters gebraucht...
Delphi-Quellcode:
Dann fliegt erstmal die ständige Definition raus
// global bzw. zentral
var FSUS, FSDE: TFormatSettings; // Init { FSUS := FormatSettings; FSUS.DecimalSeparator := '.'; FSUS.ThousandSeparator := ','; FSDE := FormatSettings; FSDE.DecimalSeparator := ','; FSDE.ThousandSeparator := '.'; } FSUS := TFormatSettings.Create('en-US'); // oder TFormatSettings.Create($0409); FSDE := TFormatSettings.Create('de-DE'); // oder TFormatSettings.Create($0407);
Delphi-Quellcode:
und wenn man weiter Unnötiges entfernt, dann bleibt nicht mehr viel übrig
function MyStrToFloat(const AString: string): double;
var x: Double; begin x := NaN; if not TryStrToFloat(AString, x, FSUS) then begin if not TryStrToFloat(AString, x, FSDE) then x := NaN; end; if IsNaN(x) then Result := 0 else Result := x; end;
Delphi-Quellcode:
oder
function MyStrToFloat(const AString: string): double;
begin if not TryStrToFloat(AString, Result, FSUS) and not TryStrToFloat(AString, Result, FSDE) then Result := 0; end;
Delphi-Quellcode:
function MyStrToFloat(const AString: string): double;
begin if not TryStrToFloat(AString, Result, FSUS) then Result := StrToFloatDef(AString, 0, FSDE); end; |
AW: Vergleich von Zahlen
Interessant wie weit man das verkürzen kann.
Danke für die Tipps |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10: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