2011-02-03 87 views
18

¿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; 
+5

¿Qué es "excepciones infinitas"? –

+4

¿Por número te refieres a entero? ¿O quieres permitir números reales también? – jpfollenius

+5

¿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. –

Respuesta

20
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'); 
+4

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

+0

y funciona en delphi 7 ya que la etiqueta sugiere – none

+2

@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

52

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; 
16

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; 
+4

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

+0

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. –

+0

@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

1

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

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.

0

Cuando utilizando el procedimiento

val (s, i, iCode);

y establecer el valor xd ....

val ('xd', i, iCode)

como resultado obtenemos: 13

1

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; 
+1

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

+0

Gracias @Pep, he corregido el código. –

-1

unidad estándar Variantes

function VarIsNumeric(v:Variant):Boolean 
+1

Esto le indica el tipo de variante, no si una cadena contiene un número. –

1

XE4 y más reciente:

for ch in s 
    TCharacter.IsNumber(ch); 

No se olvide:

uses System.Character  
2

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;