在Delphi中检查值是否为日期/数字的正确方法是什么

时间:2008-10-27 12:41:56

标签: delphi

在Delphi中检查值是否为日期/数字的正确方法是什么?

我知道其他语言有像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;

但抛出异常不能很好,并且每次调用代码时都会看到异常对话,这会使调试变得困难。

6 个答案:

答案 0 :(得分:14)

对于整数,您可以使用TryStrToInt进行检查和转换,而不会抛出异常:

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

我并不完全确定浮点数有完整的等价物,所以你可能需要使用StrToFloat()并接受TFormatException的可能性。

答案 1 :(得分:2)

有一系列功能,例如TryStrToFloatTryStrToDateTime等。顺便说一下,StrToFloat和其他人在提出异常之前在内部使用“Try”版本。

答案 2 :(得分:2)

首先,如果你想要保持开箱即用的语言,那么StrToFloatDef函数是一个很有用的选择。

但是,最好的选择是部署JEDI代码库(http://www.delphi-jedi.org/)并从那里使用StrIsNumber函数。

JEDI是开源的,在很多方面非常有用,无论如何都是必须的。

答案 3 :(得分: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;

显然,这可能并不完美,并且其中存在硬编码值的限制。完全取决于您的需求,这只是一个简单的事情,适用于内部流程。

答案 4 :(得分:1)

我使用strtointdef(singlecharacter,-1)

procedure TForm1.Button1Click(Sender: TObject);
var
x,i:integer;
teststring:string;

begin
teststring:='1235';
for i:=1 to length(teststring) do begin
    x:= strtointdef(teststring[i],-1);
    if x=-1 then break;
end;
if x<0 then showmessage('not numeric')
else showmessage('numeric');

end;

答案 5 :(得分:0)

您可以通过选中弹出的“忽略此异常”框来关闭您不想要的烦人异常。然后将针对该异常类忽略未来的异常。要再次开始询问,只需转到选项|调试器选项并取消选中您忽略的选项。