"Invalid Float" Fehler vorbeugen

Alle Fragen zur Netzwerkkommunikation
Antworten
Modellman
Beiträge: 2
Registriert: Do 8. Nov 2012, 19:07

"Invalid Float" Fehler vorbeugen

Beitrag von Modellman »

Ich habe ein kleines Rechenprogramm wo man in ein Eingabefenster eine Zahl eingeben muss.
Wenn man aber etwas anderes eingibt(Buchstaben, Alle Zeichen ausser ".") kommt die Meldung "Invalid Float".
Was muss man bei x eingeben, damit im Falle einer Flascheingabe ein Showmessagefenster kommt, dass sagt "Bitte eine Zahl eingeben"?
Hier der Code:

Code: Alles auswählen

procedure TForm1.BCalcClick(Sender: TObject);
var
   rRad, rOb, rVol :real;
const
  cPi = 3.14;
begin
 if [b](x)[/b] then
  begin
  rRad :=StrtoFloat(EInput.text);
  rOb :=4*cPi*rRad*rRad;
  rVol :=4/3*cPi*rRad*rRad*rRad;
  EOberflaeche.text :=FloattoStr(rOb);
  EVolumen.text :=FloattoStr(rVol);
end
 else
 begin
 Showmessage('Bitte eine Zahl eingeben!')
 end;
 end;
Zuletzt geändert von Lori am Fr 9. Nov 2012, 12:54, insgesamt 1-mal geändert.
Grund: Highlighter


Heinrich Wolf
Beiträge: 323
Registriert: Di 12. Apr 2011, 13:21
OS, Lazarus, FPC: WinXP + VMWare Player mit Fedora14, L 1.1, FPC 2.7.1
CPU-Target: 1core 1,8GHz 32Bit
Wohnort: Fürth
Kontaktdaten:

Re: "Invalid Float" Fehler vorbeugen

Beitrag von Heinrich Wolf »

Code: Alles auswählen

 
ok := False;
try
  rRad :=StrtoFloat(EInput.text);
  ok := True;
except
  ShowMessage('Bitte eine Zahl eingeben');
end;
if ok then
  // weiterrechnen ist ok
// else
  // weiterrechnen macht keinen Sinn
 

Im Debugger wird immer noch 'invalid float' kommen, aber im exe nur noch 'Bitte eine Zahl eingeben'.
Zuletzt geändert von Heinrich Wolf am Sa 10. Nov 2012, 07:58, insgesamt 1-mal geändert.

gocher
Beiträge: 298
Registriert: Di 23. Nov 2010, 23:41
OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
CPU-Target: 32Bit/64Bit
Wohnort: Geldern
Kontaktdaten:

Re: "Invalid Float" Fehler vorbeugen

Beitrag von gocher »

da würde ich eher TEdit erweitern

Code: Alles auswählen

unit Floatedit;
 
interface
 
uses
    StdCtrls, Classes, SysUtils;
 
type
  TFloatEdit = class(TEdit)
  private
    PreviousText: string;
  public
    constructor Create(AOwner: TComponent); override;
    procedure Change; override;
  end;
 
procedure Register;
 
implementation
 
procedure Register;
begin
  RegisterComponents('MyComps', [TFloatEdit]);
end;
 
constructor TFloatEdit.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  Text := '';
  PreviousText := '';
end;
  
procedure TFloatEdit.Change;
var
  iCode: integer;
  rValue: real;
begin
  Val(Text, rValue, iCode);
  if (iCode>0) and (Text <> '-') and (Length(Text) > 0) then
    Text := PreviousText
  else
    PreviousText := Text;
  inherited Change;
end;
 
end.
 
Zuletzt geändert von gocher am Sa 10. Nov 2012, 12:04, insgesamt 1-mal geändert.
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

u-boot
Beiträge: 306
Registriert: Do 9. Apr 2009, 10:10
OS, Lazarus, FPC: Ubuntu 9.10 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 785..

Re: "Invalid Float" Fehler vorbeugen

Beitrag von u-boot »

Wie wärs mit TFloatSpinEdit(.Value) ?
Ubuntu 9.10 (L 0.9.28 FPC 2.4.x)

diogenes
Beiträge: 200
Registriert: So 11. Jul 2010, 18:39
OS, Lazarus, FPC: Linux
CPU-Target: 64 Bit
Wohnort: Wien
Kontaktdaten:

Re: "Invalid Float" Fehler vorbeugen

Beitrag von diogenes »

u-boot hat geschrieben:Wie wärs mit TFloatSpinEdit(.Value) ?

Das ist natürlich die beste Idee, weil der User einfach nix falsch machen kann, als innerhalb des erlaubten Bereiches eine falsche Zahl zu wählen (wofür der Coder dann wirklich nix mehr kann :)). Aber in manchen Fällen denke ich, daß man die Fehlererkennung vielleicht besser selbst macht und dem User zumindest einen Tip gibt, wo er's falsch gemacht hat. Z.B.: (ungetestet!)

Code: Alles auswählen

 
procedure QuaquaEditingDone( Sender: TObject);
 var
  Result: Float;
  ErrPos: Word= 0;
 begin
   repeat
     Val( Quaqua.Text, Result, ErrPos);
     if ErrPos <> 0
      then ShowMessage( Format( 'Das ist keine Gleitkommazahl, jedenfalls nicht ab Position %d!', [ErrPos]))
    until ErrPos = 0;
// Result weiterverarbeiten
  end;
Ceterum censeo computatores per Pascal docendos esse.

Schild
Beiträge: 1
Registriert: Mi 6. Mai 2015, 08:44

Re: "Invalid Float" Fehler vorbeugen

Beitrag von Schild »

Hallo,
ich hätte gerne eine Lösung die unabhängig für eine einzelne Abfrage funktioniert.
Über if then else.

so wie hier:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit1.Text := '123.222';
  if StrIsReal(Edit1.Text) then
    ShowMessage('Valid float number! Gültige Gleitkommazahl!');
end;


Vielen Dank.

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: "Invalid Float" Fehler vorbeugen

Beitrag von Michl »

Hallo und willkommen im Forum,

für Code nutze bitte den Highlighter "Freepascal/Lazarus", das liest sich besser:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  d: Double;
begin
  Edit1.Text := '123.222';
//  Edit1.Text := '123,222';  //Je nach DefaultFormatSettings.DecimalSeparator
  if TryStrToFloat(Edit1.Text, d) then
    ShowMessage('Valid float number! Gültige Gleitkommazahl!')
  else
    ShowMessage('Invalid float number! Ungültige Gleitkommazahl!')
end;

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

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

Re: "Invalid Float" Fehler vorbeugen

Beitrag von wp_xyz »

Ich hasse Exceptions, und bei StrToFloat kann man diese mit TryStrToFloat vermeiden. Das kommt auch deinem letzten Posting sehr nahe. Da in deinem Beispiel der Zahlenstring einen Dezimalpunkt enthält, wird dies aber auf einem deutschen System nicht funktionieren - du musst noch die entsprechenden FormatSettings angeben:

Code: Alles auswählen

 
procedure TForm1.Button1Click(Sender: TObject);
var
  x: Double;
  fs: TFormatSettings;
begin
  fs := DefaultFormatSettings;
  fs.DecimalSeparator := '.';
  fs.ThousandSeparator := ' ';
  Edit1.Text := '123.222';
  if not TryStrToFloat(Edit1.Text, x, fs) then
    ShowMessage('Keine gültige Gleitkommazahl!');
end;
 
{ alternativ geht auch das "alte " val, aber nur mit Dezimalpunkt:
var
  x: double;
  code: Integer;
begin
  Edit1.Text := '123.222';
  val(Edit1.Text, x, code);
  if code <> 0 then
    ShowMessage('Keine gültige Gleitkommazahl');
end;
}

Antrepolit
Beiträge: 340
Registriert: Di 12. Sep 2006, 08:57
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Re: "Invalid Float" Fehler vorbeugen

Beitrag von Antrepolit »

TFloatSpinEdit benutzen. Vermeidet Fehler bevor sie entstehen und ist Locale-sicher.
Grüße, Antrepolit

care only if your os is really burning

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

Re: "Invalid Float" Fehler vorbeugen

Beitrag von wp_xyz »

Antrepolit hat geschrieben:TFloatSpinEdit benutzen

Naja, manchmal sind die SpinButtons aber unerwünscht, z.B. wenn man Zahlen über einen großen Wertebereich eingeben muss und nicht weiß, wie das Increment am besten zu wählen ist, und leider kann man die SpinButtons nicht ausblenden.
Zuletzt geändert von wp_xyz am Do 7. Mai 2015, 19:23, insgesamt 1-mal geändert.

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

Re: "Invalid Float" Fehler vorbeugen

Beitrag von Mathias »

Wen die Funktion zwingend mit einem '.' sein muss, würde ich Val verwenden.

ZB. so:

Code: Alles auswählen

function StrToExtended(s: string): extended;
var
  e: integer;
begin
  Val(s, Result, e);
  if e <> 0 then begin
    ShowMessage('Fehler');
  end;
end;   
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antrepolit
Beiträge: 340
Registriert: Di 12. Sep 2006, 08:57
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Kontaktdaten:

Re: "Invalid Float" Fehler vorbeugen

Beitrag von Antrepolit »

wp_xyz hat geschrieben:
Antrepolit hat geschrieben:TFloatSpinEdit benutzen

Naja, manchmal sind die SpinButtons aber unerwünscht, z.B. wenn man Zahlen über einen großen Wertebereich eingeben muss und nicht weiß, wie das Increment am besten zu wählen ist, und leider kann man die SpinButtons nicht ausblenden.

Man kann den Wert manuell eingeben und Fehleingaben werden im Vorfeld vermieden. Effektiver als alle IFs und TRY-EXCEPTS. Hier wird so oft das Rad neu erfunden mit und

Code: Alles auswählen

trystrtoint
und in jeder Variante finde ich auf einen Blick einen Fehler. Das ist also auch nicht die Lösung.
Grüße, Antrepolit

care only if your os is really burning

Antworten