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;
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');
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;
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;
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;
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;
XE4 et plus récent:
for ch in s do
TCharacter.IsNumber(ch);
N'oubliez pas:
uses System.Character
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.
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;
Lorsque vous utilisez la procédure
val (s, i, iCode);
et définissez la valeur xd ....
val ('xd', i, iCode)
on obtient ainsi: 13