web-dev-qa-db-fra.com

Delphi isNumber

Existe-t-il une méthode dans Delphi pour vérifier si une chaîne est un nombre sans déclencher une exception?

son pour l'analyse int.

et une exception se lèvera si l'on utilise le

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

fonction TryStrToInt (const S: string; out Value: Integer): Boolean;

TryStrToInt convertit la chaîne S, qui représente un nombre de type entier en notation décimale ou hexadécimale, en un nombre, qui est affecté à Value. Si S ne représente pas un nombre valide, TryStrToInt renvoie false; sinon TryStrToInt renvoie true.

Pour accepter des valeurs décimales mais pas hexadécimales dans la chaîne d'entrée, vous pouvez utiliser un code comme celui-ci:

function TryDecimalStrToInt( const S: string; out Value: Integer): Boolean;
begin
   result := ( pos( '$', S ) = 0 ) and TryStrToInt( S, Value );
end;
57
ba__friend

Essayez cette fonction StrToIntDef()

De l'aide

Convertit une chaîne qui représente un entier (notation décimale ou hexadécimale) en nombre avec une erreur par défaut.

Pascal

function StrToIntDef(const S: string; Default: Integer): Integer;

Modifier

Je viens de vérifier la source de la fonction TryStrToInt() dans Delphi 2007. Si Delphi 7 ne possède pas cette fonction, vous pouvez écrire comme ceci. C'est juste un code poli pour une réponse 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

utiliser cette fonction

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;

fin;

3
sina

Pour les anciennes versions de Delphi de delphi 5, exemple d'aide:

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 et plus récent:

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

N'oubliez pas:

uses System.Character    
2
zawuza

Dans delphi 7, vous pouvez utiliser la procédure Val. De l'aide:

nité: Système Syntaxe Delphi:procedure Val(S; var V; var Code: Integer);

S est une expression de type chaîne; il doit s'agir d'une séquence de caractères formant un nombre réel signé.

V est une variable de type entier ou de type réel. Si V est une variable de type entier, S doit former un nombre entier.

Le code est une variable de type Integer.

Si la chaîne n'est pas valide, l'index du caractère incriminé est stocké dans Code; sinon, Code est mis à zéro. Pour une chaîne terminée par un caractère nul, la position d'erreur renvoyée dans Code est une plus grande que l'index de base zéro réel du caractère en erreur.

2
Robert Niestroj

Dans certaines langues, les séparateurs décimaux sont différents (par exemple, "." Est utilisé en anglais et "," est utilisé en russe). Pour ces cas, pour convertir une chaîne en nombre réel, la procédure suivante est proposée:

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;

Mise à jour

Comme @Pep l'a mentionné, TryStrToFloat intercepte les exceptions, mais il renvoie une valeur booléenne. Donc, le bon code est:

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

Lorsque vous utilisez la procédure

val (s, i, iCode);

et définissez la valeur xd ....

val ('xd', i, iCode)

on obtient ainsi: 13

0
androschuk.a