2008-10-27 2 views
6

델파이에서 값이 날짜/숫자인지 확인하는 올바른 방법은 무엇입니까?델파이에서 값이 날짜/숫자인지 확인하는 올바른 방법은 무엇입니까

isDate 및 isNaN과 같은 기능을 가진 다른 언어를 알고 있지만 델파이는 무엇입니까? 분에 나는이

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를 확인하십시오. –

+0

고마워, Gamecat. 몇 년이 지났음) – Alan

+0

더 많은 도움이 필요하면 CodeGear 문서를 온라인으로 사용할 수 있습니다. http://docs.codegear.com/ – stukelly

2

TryStrToFloat, TryStrToDateTime 등과 같은 기능이 있습니다. 그런데 StrToFloat 및 다른 사람들은 예외를 발생시키기 전에 내부적으로 "Try"버전을 사용합니다.

2

먼저 StrToFloatDef 함수는 상자 밖의 언어로 머물고 싶을 때 유용합니다.

그러나 가장 좋은 방법은 JEDI 코드 라이브러리 (http://www.delphi-jedi.org/)를 배포하고 거기에서 StrIsNumber 함수를 사용하는 것입니다.

JEDI는 오픈 소스이며, 많은면에서 매우 유용하며, 어쨌든 반드시 사용해야합니다.

0

"이 예외 무시"상자가 표시되면 원하지 않는 성가신 예외를 해제 할 수 있습니다. 향후 예외는 해당 예외 클래스에 대해 무시됩니다. 다시 묻기 시작하려면 Options | Debugger Options로 가서 무시하고있는 옵션의 선택을 취소하십시오.

+0

나는 이것이 매우 놀랄만 한 방법이라고 생각합니다. 예외가 없다면 항상 예외에 대해 알고 싶어합니다. 유형 변환은 하나도 아닙니다. 내가 한 적이있는 유일한 시간은 알고있는 예외를 던지는 MS OpenGl DLL과 함께하는 것입니다. – Cruachan

+0

어쨌든, skamradt는 통합 디버거가 예외 사항을 알리는 것에 대해 이야기하고있었습니다 ("Options | Debugger Options"참고). 디버거가 디버거를 함정에 빠뜨리지 않고 응용 프로그램 자체에서 처리하게됩니다. – Argalatyr

+0

정확합니다.코드에서 올바르게 처리하고 많은 반복이 포함 된 루프에서 호출되는 API 호출에 의해 생성되는 예외가있을 때 매우 유용합니다. 디버거를 무시하면 f9 키를 착용하는 것보다 훨씬 낫습니다. – skamradt

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; 

물론 완벽하지 않을 수 있으며 하드 코딩 된 값의 제한이 있습니다. 전적으로 귀하의 필요에 따라, 이것은 내부 프로세스에 잘 작동하는 단순한 것이 었습니다.

관련 문제