Prüfen ob es ein Float ist oder nicht?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
TT73GP7
Beiträge: 238
Registriert: Di 29. Mär 2016, 20:45

Prüfen ob es ein Float ist oder nicht?

Beitrag von TT73GP7 »

Hallo zusammen,

ich habe irgendwie einen Knoten in Kopf.
Also ich habe eine Form wo eine MaskEdit (####,##;1;_) drauf ist.

Nun will ich den Inhalt in eine Datenbank schreiben:

Code: Alles auswählen

 
SQL.TEXT := 'Insert Into DBArtikel (Preis) VALUES (:PREIS)'
SQL.ParamByName('PREIS').ASFloat := StrtoFloat(stringreplace(MASKEdit.Text,' ','',[rfReplaceAll]));
SQL.ExecSQL;
 


jut läuft auch alles
nun kommen aber die Anwender auf die Idee so etwas einzutippen:

6,
oder
,99
oder
5


wie bekomme ich denn so etwas abgefangen?
PS ich weiß es gibt eine dbMaskEdit aber die nutzen wir garnicht (hat tausend gründe von denen ich nicht einen verstehe)

kann mir jemand Helfen?

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Prüfen ob es ein Float ist oder nicht?

Beitrag von Mathias »

nun kommen aber die Anwender auf die Idee so etwas einzutippen:

6,
oder
,99
oder
5

Was ist dabei das Problem ?
StrToFloat kommt auch mit solchen Werten zu recht. Sogar wen am Anfang #32 vorhanden sind.

Ansonsten, färbt diese Funktion ein Edit Rot ein, wen die Eingabe ungültig ist.

Code: Alles auswählen

procedure TForm1.Edit1Change(Sender: TObject);
var
  ed: TEdit;
  f: single;
begin
  ed := TEdit(Sender);
  if (ed.Caption <> '') and TryStrToFloat(ed.Caption, f) then begin
    ed.Color := clYellow;
  end else begin
    ed.Color := $D0D0FF;
  end;
end;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

TT73GP7
Beiträge: 238
Registriert: Di 29. Mär 2016, 20:45

Re: Prüfen ob es ein Float ist oder nicht?

Beitrag von TT73GP7 »

na das Problem ist das die Datenbank meckert das '6,' kein Float ist
Die erwartet halt '6,00'

TT73GP7
Beiträge: 238
Registriert: Di 29. Mär 2016, 20:45

Re: Prüfen ob es ein Float ist oder nicht?

Beitrag von TT73GP7 »

ok

hab grade rausgefunden das ich mit strtofloat auch gleich das Format angeben kann

nur leider finde ich kein passendes Beispiel
meine erste Idee war '%10.2f'
aber das mag er garnicht

Benutzeravatar
gladio
Beiträge: 217
Registriert: Sa 21. Jun 2014, 06:15
OS, Lazarus, FPC: Win10-64 - aktuelle Lazarus/FPC Standard-Edition
CPU-Target: 64Bit
Wohnort: Rügen

Re: Prüfen ob es ein Float ist oder nicht?

Beitrag von gladio »

versuche doch mal sowas

Code: Alles auswählen

PREIS.AsFloat:=StrToFloat(FormatFloat('0.00',StrToFloat(MaskEdit.Text)));

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Prüfen ob es ein Float ist oder nicht?

Beitrag von Mathias »

TT73GP7 hat geschrieben:na das Problem ist das die Datenbank meckert das '6,' kein Float ist
Die erwartet halt '6,00'

Ich sehe dein Problem nicht.
Ist es die MaskEdit, welche schon Probleme macht.
Deiner Datenbank übergibst du ja einen Float, in dieser ist immer gleich.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

TT73GP7
Beiträge: 238
Registriert: Di 29. Mär 2016, 20:45

Re: Prüfen ob es ein Float ist oder nicht?

Beitrag von TT73GP7 »

gladio hat geschrieben:versuche doch mal sowas

Code: Alles auswählen

PREIS.AsFloat:=StrToFloat(FormatFloat('0.00',StrToFloat(MaskEdit.Text)));



hach
endlich das ist die Lösung

vielen dank

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Prüfen ob es ein Float ist oder nicht?

Beitrag von wp_xyz »

gladio hat geschrieben:versuche doch mal sowas

Code: Alles auswählen

PREIS.AsFloat:=StrToFloat(FormatFloat('0.00',StrToFloat(MaskEdit.Text)));

Warum die dreifache Umwandlung?

Ungetestet müssten beide der folgenden Möglichkeiten funktionieren:

Code: Alles auswählen

function NoSpaces(s: String): String;
var
  i, j: Integer;
begin
  SetLength(Result, Length(s));
  i := 1;
  j := 0;
  while i <= Length(s) do begin
    if s[i] <> ' ' then begin
      inc(j);
      Result[j] := s[i];
    end;
    inc(i);
  end;
  SetLength(Result, j);
end;
 
SQL.ParamByName('PREIS').AsFloat := StrToFloat(NoSpaces(MaskEdit.Text));
SQL.ParamByName('PREIS').AsString := NoSpaces(MaskEdit.Text);

Antworten