web-dev-qa-db-ja.com

Delphi isNumber

Delphiには、例外を発生させずに文字列が数値であるかどうかを確認する方法がありますか?

int解析用です。

使用すると例外が発生します

try
  StrToInt(s);
except
  //exception handling
end;
20
none
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');
23
da-soft

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;
57
ba__friend

この関数を試してください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;
_
16
Bharat

この機能を使用する

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;

終わり;

3
sina

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;
2
GJ.

XE4以降:

for ch in s do
   TCharacter.IsNumber(ch);

忘れないでください:

uses System.Character    
2
zawuza

Delphi 7では、Valプロシージャを使用できます。ヘルプから:

単位:システムDelphi構文:procedure Val(S; var V; var Code: Integer);

Sは文字列型の式です。符号付き実数を形成する一連の文字である必要があります。

Vは整数型または実数型の変数です。 Vが整数型変数の場合、Sは整数を形成する必要があります。

コードは整数型の変数です。

文字列が無効な場合、問題の文字のインデックスはコードに保存されます。それ以外の場合、コードはゼロに設定されます。 nullで終わる文字列の場合、Codeで返されるエラー位置は、エラーのある文字の実際のゼロベースのインデックスよりも1つ大きくなります。

2
Robert Niestroj

一部の言語では、小数点記号が異なります(たとえば、英語では「。」が使用され、ロシア語では「、」が使用されます)。これらのケースで文字列を実数に変換するには、次の手順を提案します。

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;
1
Ivan Z

手順を使用する場合

val(s、i、iCode);

設定値xd ....

val( 'xd'、i、iCode)

その結果、13が得られます。

0
androschuk.a