¿Hay algún método en Delphi para verificar si una cadena es un número sin generar una excepción?Delphi isNumber
es para el análisis int.
y una excepción aumentará si se utiliza el
try
StrToInt(s);
except
//exception handling
end;
¿Hay algún método en Delphi para verificar si una cadena es un número sin generar una excepción?Delphi isNumber
es para el análisis int.
y una excepción aumentará si se utiliza el
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');
La ventaja de esta solución es que también funciona con números reales. Por el precio de ser mucho más difícil de leer que 'TryStrToInt'. Y requiere al menos dos variables locales. – jpfollenius
y funciona en delphi 7 ya que la etiqueta sugiere – none
@none: 'TryStrToInt' debería estar disponible en D7. ¿Alguna razón por la que aceptaste esta solución y no la publicada por Bassfriend? – jpfollenius
función TryStrToInt (const S: string; disponibles Valor: Entero): Boolean;
TryStrToInt convierte la cadena S, que representa un número 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 falso; de lo contrario, TryStrToInt devuelve verdadero.
Para aceptar los valores decimales pero no hexadecimales en la cadena de entrada, es posible usar un código como éste:
function TryDecimalStrToInt(const S: string; out Value: Integer): Boolean;
begin
result := (pos('$', S) = 0) and TryStrToInt(S, Value);
end;
Pruebe esta función StrToIntDef()
De ayuda
Convierte una cadena que representa un número entero (decimal o hexadecimal) a un número con error predeterminado.
Pascal
function StrToIntDef(const S: string; Default: Integer): Integer;
Editar
Justo ahora comprobado la fuente de TryStrToInt()
función en Delphi 2007. Si Delphi 7 no tienen esta función se puede escribir como este. Es sólo un código de pulido a da-blanda respuesta
function TryStrToInt(const S: string; out Value: Integer): Boolean;
var
E: Integer;
begin
Val(S, Value, E);
Result := E = 0;
end;
Esta es una buena opción ** SI ** hay un valor predeterminado obvio que realmente tiene sentido. Si solo se usa para verificar si el resultado es -1 después (por ejemplo), 'TryStrToInt' es mucho más robusto y legible. – jpfollenius
Una función útil, pero no aborda la pregunta como se le preguntó. No hay forma de saber si la entrada fue o no un número. –
@David: Sí, usted está en lo correcto, pero solo quiero sugerir una alternativa que ayude al usuario a establecer un valor predeterminado también – Bharat
Para versiones anteriores de Delphi de Delphi ejemplo 5 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;
en Delphi 7 se puede utilizar el procedimiento de 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 ofensivo se almacena en 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 Código es una más grande que el índice real basado en cero del carácter en error.
Cuando utilizando el procedimiento
val (s, i, iCode);
y establecer el valor xd ....
val ('xd', i, iCode)
como resultado obtenemos: 13
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 cadena a 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;
actualización
Como se mencionó @Pep capturar excepciones TryStrToFloat, pero devuelve el valor booleano. Por lo que 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;
Si bien la observación sobre separadores de decimales diferentes es definitivamente importante, el código de muestra intenta capturar excepciones donde no hay excepciones, porque TryStrToFloat ya capta cualquier posible excepción. Esto significa que su cláusula "except" nunca se ejecuta. "¡Buena captura!", Podrías pensar :) – Pep
Gracias @Pep, he corregido el código. –
unidad estándar Variantes
function VarIsNumeric(v:Variant):Boolean
Esto le indica el tipo de variante, no si una cadena contiene un número. –
XE4 y más reciente:
for ch in s
TCharacter.IsNumber(ch);
No se olvide:
uses System.Character
uso de 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;
final;
¿Qué es "excepciones infinitas"? –
¿Por número te refieres a entero? ¿O quieres permitir números reales también? – jpfollenius
¿Es necesario que el número de la cadena sea un número que se puede almacenar con un tipo de letra Delphi? Diecinueve trillones es un número, pero no cabrá en ningún tipo integral Delphi. Ciento milésimo es un número, pero ningún tipo numérico Delphi puede contenerlo. –