Prüfen ob es ein Float ist oder nicht?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut

Prüfen ob es ein Float ist oder nicht?

Beitragvon TT73GP7 » 19. Dez 2017, 15:27 Prüfen ob es ein Float ist oder nicht?

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?
TT73GP7
 
Beiträge: 226
Registriert: 29. Mär 2016, 19:45

Beitragvon Mathias » 19. Dez 2017, 16:59 Re: Prüfen ob es ein Float ist oder nicht?

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4105
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon TT73GP7 » 19. Dez 2017, 17:23 Re: Prüfen ob es ein Float ist oder nicht?

na das Problem ist das die Datenbank meckert das '6,' kein Float ist
Die erwartet halt '6,00'
TT73GP7
 
Beiträge: 226
Registriert: 29. Mär 2016, 19:45

Beitragvon TT73GP7 » 19. Dez 2017, 17:35 Re: Prüfen ob es ein Float ist oder nicht?

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
TT73GP7
 
Beiträge: 226
Registriert: 29. Mär 2016, 19:45

Beitragvon gladio » 19. Dez 2017, 17:42 Re: Prüfen ob es ein Float ist oder nicht?

versuche doch mal sowas
Code: Alles auswählen
PREIS.AsFloat:=StrToFloat(FormatFloat('0.00',StrToFloat(MaskEdit.Text)));
gladio
 
Beiträge: 95
Registriert: 21. Jun 2014, 05:15
Wohnort: Insel Rügen
OS, Lazarus, FPC: Win7/10-32/64 - Laz 1.8 Standard-Edition | 
CPU-Target: 32/64Bit
Nach oben

Beitragvon Mathias » 19. Dez 2017, 18:01 Re: Prüfen ob es ein Float ist oder nicht?

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4105
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon TT73GP7 » 19. Dez 2017, 18:03 Re: Prüfen ob es ein Float ist oder nicht?

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
TT73GP7
 
Beiträge: 226
Registriert: 29. Mär 2016, 19:45

Beitragvon wp_xyz » 19. Dez 2017, 18:15 Re: Prüfen ob es ein Float ist oder nicht?

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);
wp_xyz
 
Beiträge: 2563
Registriert: 8. Apr 2011, 08:01

• Themenende •

Zurück zu Freepascal



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste

porpoises-institution
accuracy-worried