德尔福是数字

时间:2011-02-03 09:22:39

标签: delphi delphi-7

Delphi中是否有方法检查字符串是否为数字而不引发异常?

用于int解析。

如果使用

,则会引发异常
try
  StrToInt(s);
except
  //exception handling
end;

10 个答案:

答案 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 ....

  

val('xd',i,iCode)

结果我们得到:13

答案 9 :(得分:-1)

标准单位变体

function VarIsNumeric(v:Variant):Boolean