2008-10-27 7 views
6

Was ist die korrekte Art zu überprüfen, ob ein Wert ein Datum/eine Zahl in Delphi ist?Was ist die korrekte Art zu überprüfen, ob ein Wert ein Datum/eine Zahl in Delphi ist?

Ich weiß, dass andere Sprachen Funktionen wie isDate und isNaN haben, aber was ist das Delphi-Äquivalent? in der Minute habe ich diese

function isNumeric(s1:string):boolean; 
begin 
    // will throw exception if its not a number 
    // there must be a better way to do this!! 
    try 
    StrTofloat(s1); 
     result := TRUE ; 
    except 
     result := FALSE; 
     end; 
end; 

Aber werfen Ausnahmen kann nicht gut sein, und es macht das Debuggen hart wie ich die Ausnahme Dialog der Code jedes Mal sehe ständig aufgerufen wird.

Antwort

14

Für ganze Zahlen sind, könnten Sie TryStrToInt verwenden, um zu überprüfen und zu konvertieren, ohne werfen Ausnahmen: für Schwimmer, obwohl

function TryStrToInt(const s: string; out i : integer): boolean; 

Ich bin nicht absolut sicher, dass es ein volles Äquivalent ist, so dass Sie StrToFloat verwenden müssen möglicherweise () und akzeptieren Sie die Möglichkeit einer TFormatException.

+1

Ja, es gibt auch TryStrToDate und TryStrToFloat und noch mehr. Überprüfen Sie SysUtils. –

+0

Danke, Gamecat. Es ist ein paar Jahre her;) – Alan

+0

CodeGear Dokumente sind online verfügbar, wenn Sie weitere Hilfe benötigen. http://docs.codegear.com/ – stukelly

2

Es gibt eine Familie von Funktionen wie TryStrToFloat, TryStrToDateTime usw., die das tun. By the way, StrToFloat und andere verwenden die "Try" -Versionen intern vor dem Auslösen von Ausnahmen.

2

Erstens StrToFloatDef Funktion ist eine sinnvolle Alternative hier, wenn Sie in der Sprache wie geliefert bleiben wollen.

Ihre beste Option ist jedoch die Bereitstellung der JEDI-Code-Bibliotheken (http://www.delphi-jedi.org/) und die Verwendung der StrIsNumber-Funktion von dort.

JEDI ist Open Source, sehr nützlich in vielerlei Hinsicht, und so ziemlich ein Muss.

0

Sie können die lästigen Ausnahmen, die Sie nicht möchten, deaktivieren, indem Sie das Kästchen "Ignoriere diese Ausnahme" aktivieren. Zukünftige Ausnahmen werden dann für diese Ausnahmeklasse ignoriert. Um erneut zu fragen, gehen Sie einfach zu Optionen | Debugger-Optionen und deaktivieren Sie die Optionen, die Sie ignorieren.

+0

Ich denke, das ist ein phänomenal gefährlicher Weg zu gehen - Sie wollen immer über Ihre Ausnahmen wissen, es sei denn, es gibt einen guten Grund nicht zu - und Typumwandlung ist keine. Die einzige Zeit, die ich jemals getan habe, ist mit den MS OpenGl DLLs, die eine bekannte Ausnahme werfen und Sie haben auch. – Cruachan

+0

Äh, es ist ziemlich klar, dass skamradt über die Benachrichtigung des integrierten Debuggers über Ausnahmen gesprochen hat (beachten Sie den Verweis auf "Optionen | Debugger-Optionen"). Das bedeutet nur, dass der Debugger sie nicht abfängt, und sie werden von der Anwendung selbst behandelt. – Argalatyr

+0

Genau.Sehr nützlich, wenn Sie eine Ausnahme haben, die von einem API-Aufruf erzeugt wird, den Sie ordnungsgemäß in Code verarbeiten und der in einer Schleife mit vielen Iterationen aufgerufen wird. Den Debugger zu ignorieren, ist so viel besser als den F9-Schlüssel zu verschleißen. – skamradt

2

Das Abfangen von Ausnahmen ist sehr langsam. Wenn Sie eine solche Funktion wiederholt in schneller Folge verwenden möchten, z. B. beim Überprüfen von Feldern während eines Dateiimports, kann es sich lohnen, eine eigene Funktion zu starten, die eine einfache Überprüfung auf Zeichenebene durchführt, bevor sie in einen try/except-Block fällt. Ich habe etwas Ähnliches zuvor mit einer enormen Leistungssteigerung beim Parsen großer Datenmengen verwendet, die nicht im richtigen Format waren.

 
function IsNumeric(aValue : string): boolean; 
var 
    i : integer; 
begin 
    result := false; 
    for i := 1 to Length(aValue) do 
    if (NOT (aValue[i] in ['0'..'9', '.', '-', '+', 'E', 'e'])) then 
     exit; 
    try 
    StrToFloat(aValue); 
    result := true; 
    except 
    end; 
end; 

Offensichtlich kann dies nicht perfekt sein, und hat die Begrenzung der fest codierten Werte drin. Ganz auf Ihre Bedürfnisse abgestimmt, war dies einfach etwas, das für einen internen Prozess gut funktionierte.