在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;
但抛出异常不能很好,并且每次调用代码时都会看到异常对话,这会使调试变得困难。
答案 0 :(得分:14)
对于整数,您可以使用TryStrToInt进行检查和转换,而不会抛出异常:
function TryStrToInt(const s: string; out i : integer): boolean;
我并不完全确定浮点数有完整的等价物,所以你可能需要使用StrToFloat()并接受TFormatException的可能性。
答案 1 :(得分:2)
有一系列功能,例如TryStrToFloat
,TryStrToDateTime
等。顺便说一下,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)
您可以通过选中弹出的“忽略此异常”框来关闭您不想要的烦人异常。然后将针对该异常类忽略未来的异常。要再次开始询问,只需转到选项|调试器选项并取消选中您忽略的选项。