2008-10-27 16 views
6

什麼是正確的方法來檢查一個值是一個日期/數字在德爾福?什麼是正確的方法來檢查一個值是一個日期/數字在德爾福

我知道其他語言有像isDate和isNaN這樣的函數,但是什麼是Delphi等價的?在一分鐘我有這個

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; 

但拋出異常不能好,這讓我保持每次代碼調用時看到異常對話調試難。

回答

14

對於整數,你可以使用TryStrToInt檢查並沒有拋出異常轉換:

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

我沒有絕對的把握有一個完整等效花車,雖然如此,你可能需要使用StrToFloat( )並接受TFormatException的可能性。

+1

是的,還有TryStrToDate和TryStrToFloat,甚至更多。檢查SysUtils。 – 2008-10-27 12:48:47

+0

謝謝,Gamecat。已經過了幾年;) – Alan 2008-10-27 14:32:32

2

有一系列的功能,如TryStrToFloatTryStrToDateTime等。順便提一句,StrToFloat和其他人在引發異常之前在內部使用「Try」版本。

2

首先StrToFloatDef函數在這裏是一個有用的替代方法,如果你想留在語言中傳遞出來的話。

但是,您最好的選擇是部署JEDI代碼庫(http://www.delphi-jedi.org/)並從那裏使用StrIsNumber函數。

JEDI是開源的,在很多方面都非常有用,而且幾乎是必須的。

0

您可以通過選中彈出的「忽略此例外」框關閉您不想要的煩人異常。對於該異常類,將來的異常將被忽略。要再次開始詢問,只需進入選項|調試器選項,然後取消選中那些你正在忽略的選項。

2

捕捉異常非常緩慢。如果您打算連續快速地重複使用這樣的函數,比如在文件導入過程中驗證字段時,在落入try/except塊之前,可能需要將自己的函數進行一些簡單的字符級別檢查。在分析大量不正確格式的數據時,我已經使用過類似的東西,並且性能提高了很多。

 
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; 

顯然這可能不完美,並且有硬編碼值的限制。完全取決於您的需求,這只是簡單的一種方法,對於內部流程而言效果很好。

相關問題