versiones - Delphi esNúmero
que es delphi 2010 (10)
Cuando usas procedimiento
val (s, i, iCode);
y establecer valor xd ....
val (''xd'', i, iCode)
como resultado obtenemos: 13
¿Hay un método en Delphi para verificar si una cadena es un número sin generar una excepción?
Es para el análisis int.
y una excepción aumentará si uno usa el
try
StrToInt(s);
except
//exception handling
end;
En algunos idiomas, los separadores decimales son diferentes (por ejemplo, ''.'' Se usa en inglés y '','' se usa en ruso). Para estos casos, para convertir una cadena a un número real, se propone el siguiente procedimiento:
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;
Actualizar
Como @Pep mencionó las excepciones de captura TryStrToFloat, pero devuelve un valor booleano. Entonces el código correcto es:
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;
En delphi 7 puedes usar el procedimiento Val
. De la ayuda:
Unidad: sistema Delphi sintaxis: procedure Val(S; var V; var Code: Integer);
S es una expresión de tipo cadena; debe ser una secuencia de caracteres que forman un número real firmado.
V es una variable de tipo entero o real. Si V es una variable de tipo entero, S debe formar un número entero.
El código es una variable de tipo entero.
Si la cadena no es válida, el índice del carácter infractor se almacena en el Código; de lo contrario, el código se establece en cero. Para una cadena terminada en nulo, la posición de error devuelta en el Código es una más grande que el índice real basado en cero del carácter erróneo.
Para versiones anteriores de Delphi de delphi 5, ejemplo de ayuda:
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;
Prueba esta función StrToIntDef()
De ayuda
Convierte una cadena que representa un número entero (notación decimal o hexadecimal) a un número con error predeterminado.
Pascal
function StrToIntDef(const S: string; Default: Integer): Integer;
Editar
Acabo de verificar la fuente de la función TryStrToInt()
en Delphi 2007. Si Delphi 7 no tiene esta función, puede escribir así. Es solo un código pulido para una respuesta suave
function TryStrToInt(const S: string; out Value: Integer): Boolean;
var
E: Integer;
begin
Val(S, Value, E);
Result := E = 0;
end;
Variantes de la unidad estándar
function VarIsNumeric(v:Variant):Boolean
XE4 y más reciente:
for ch in s do
TCharacter.IsNumber(ch);
No olvides
uses System.Character
función TryStrToInt (const S: string; out Valor: Integer): Boolean;
TryStrToInt convierte la cadena S, que representa un número de tipo entero en notación decimal o hexadecimal, en un número, que se asigna a Valor. Si S no representa un número válido, TryStrToInt devuelve false; de lo contrario, TryStrToInt devuelve true.
Para aceptar valores decimales pero no hexadecimales en la cadena de entrada, puede usar código como este:
function TryDecimalStrToInt( const S: string; out Value: Integer): Boolean;
begin
result := ( pos( ''$'', S ) = 0 ) and TryStrToInt( S, Value );
end;
usa esta función
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;
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'');