Delphi中是否有方法检查字符串是否为数字而不引发异常?
用于int解析。
如果使用
,则会引发异常try
StrToInt(s);
except
//exception handling
end;
答案 0 :(得分:57)
function TryStrToInt(const S:string; out Value:Integer):Boolean;
TryStrToInt将字符串S(表示十进制或十六进制表示法的整数类型编号)转换为数字,该数字分配给Value。如果S不表示有效数字,则TryStrToInt返回false;否则TryStrToInt返回true。
要接受输入字符串中的十进制值而不是十六进制值,可以使用以下代码:
function TryDecimalStrToInt( const S: string; out Value: Integer): Boolean;
begin
result := ( pos( '$', S ) = 0 ) and TryStrToInt( S, Value );
end;
答案 1 :(得分:22)
var
s: String;
iValue, iCode: Integer;
...
val(s, iValue, iCode);
if iCode = 0 then
ShowMessage('s has a number')
else
ShowMessage('s has not a number');
答案 2 :(得分:16)
尝试此功能StrToIntDef()
来自帮助
将表示整数(十进制或十六进制表示法)的字符串转换为默认值为错误的数字。
帕斯卡
function StrToIntDef(const S: string; Default: Integer): Integer;
修改强>
刚刚检查了Delphi 2007中TryStrToInt()
函数的来源。如果Delphi 7没有这个函数,你可以像这样写。它只是一个完美的代码,以达到轻柔的答案
function TryStrToInt(const S: string; out Value: Integer): Boolean;
var
E: Integer;
begin
Val(S, Value, E);
Result := E = 0;
end;
答案 3 :(得分:3)
使用此功能
function IsNumber(N : String) : Boolean;
var
I : Integer;
begin
Result := True;
if Trim(N) = '' then
Exit(False);
if (Length(Trim(N)) > 1) and (Trim(N)[1] = '0') then
Exit(False);
for I := 1 to Length(N) do
begin
if not (N[I] in ['0'..'9']) then
begin
Result := False;
Break;
end;
end;
端;
答案 4 :(得分:2)
对于delphi 5中较旧的Delphi版本帮助示例:
uses Dialogs;
var
I, Code: Integer;
begin
{ Get text from TEdit control }
Val(Edit1.Text, I, Code);
{ Error during conversion to integer? }
if Code <> 0 then
MessageDlg('Error at position: ' + IntToStr(Code), mtWarning, [mbOk], 0);
else
Canvas.TextOut(10, 10, 'Value = ' + IntToStr(I));
end;
答案 5 :(得分:2)
在delphi 7中,您可以使用Val
过程。来自帮助:
单位:系统
Delphi语法: procedure Val(S; var V; var Code: Integer);
S是字符串类型表达式;它必须是形成有符号实数的字符序列。
V是整数类型或实型变量。如果V是整数类型变量,则S必须形成整数。
Code是Integer类型的变量。
如果字符串无效,则违规字符的索引存储在Code中;否则,代码设置为零。对于以null结尾的字符串,Code中返回的错误位置大于错误字符的实际从零开始的索引。
答案 6 :(得分:1)
在某些语言中,小数分隔符不同(例如,'。'用于英语,','用于俄语)。对于将字符串转换为实数的这些情况,建议采用以下过程:
function TryStrToFloatMultylang(const S : String; out Value : Extended) : Boolean;
var
dc : char;
begin
Result := false;
dc := DecimalSeparator;
DecimalSeparator := '.';
try
Result := TryStrToFloat(S, Value);
except
DecimalSeparator := ',';
Result := TryStrToFloat(S, Value);
end;
DecimalSeparator := dc;
end;
<强>更新强>
正如@Pep提到的TryStrToFloat捕获异常,但它返回布尔值。所以正确的代码是:
function TryStrToFloatMultylang(const S : String; out Value : Extended) : Boolean;
var
dc : char;
begin
Result := false;
dc := DecimalSeparator;
DecimalSeparator := '.';
Result := TryStrToFloat(S, Value);
if not Result then begin
DecimalSeparator := ',';
Result := TryStrToFloat(S, Value);
end;
DecimalSeparator := dc;
end;
答案 7 :(得分:1)
XE4及更新版本:
for ch in s do
TCharacter.IsNumber(ch);
不要忘记:
uses System.Character
答案 8 :(得分:0)
使用程序时
val(s,i,iCode);
并设置值xd ....
结果我们得到:13val('xd',i,iCode)
答案 9 :(得分:-1)
标准单位变体
function VarIsNumeric(v:Variant):Boolean