Delphiには、例外を発生させずに文字列が数値であるかどうかを確認する方法がありますか?
int解析用です。
使用すると例外が発生します
try
StrToInt(s);
except
//exception handling
end;
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');
function TryStrToInt (const S:文字列; out値:整数):ブール値;
TryStrToIntは、10進表記または16進表記の整数型の数値を表す文字列Sを、Valueに割り当てられる数値に変換します。 Sが有効な数値を表していない場合、TryStrToIntはfalseを返します。そうでない場合、TryStrToIntはtrueを返します。
入力文字列で16進数ではなく10進数の値を受け入れるには、次のようなコードを使用できます。
function TryDecimalStrToInt( const S: string; out Value: Integer): Boolean;
begin
result := ( pos( '$', S ) = 0 ) and TryStrToInt( S, Value );
end;
この関数を試してくださいStrToIntDef()
ヘルプから
整数(10進または16進表記)を表す文字列を、エラーがデフォルトの数値に変換します。
パスカル
_function StrToIntDef(const S: string; Default: Integer): Integer;
_
編集
Delphi 2007でTryStrToInt()
関数のソースを確認しました。Delphi7にこの関数がない場合は、次のように記述できます。 da-softの回答に対する洗練されたコード
_function TryStrToInt(const S: string; out Value: Integer): Boolean;
var
E: Integer;
begin
Val(S, Value, E);
Result := E = 0;
end;
_
この機能を使用する
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;
終わり;
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;
XE4以降:
for ch in s do
TCharacter.IsNumber(ch);
忘れないでください:
uses System.Character
Delphi 7では、Val
プロシージャを使用できます。ヘルプから:
単位:システムDelphi構文:procedure Val(S; var V; var Code: Integer);
Sは文字列型の式です。符号付き実数を形成する一連の文字である必要があります。
Vは整数型または実数型の変数です。 Vが整数型変数の場合、Sは整数を形成する必要があります。
コードは整数型の変数です。
文字列が無効な場合、問題の文字のインデックスはコードに保存されます。それ以外の場合、コードはゼロに設定されます。 nullで終わる文字列の場合、Codeで返されるエラー位置は、エラーのある文字の実際のゼロベースのインデックスよりも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;
手順を使用する場合
val(s、i、iCode);
設定値xd ....
val( 'xd'、i、iCode)
その結果、13が得られます。