2009-07-08 16 views
6

Necesitaba una función que simplemente marca si una cadena se puede convertir a un número entero válido (para la validación del formulario).¿Existe alguna forma mejor de determinar si una cadena puede ser un número entero distinto de try/catch?

Después de buscar, terminé usando una función que tenía desde 2002 que funciona usando C# 1 (abajo).

Sin embargo, me parece que aunque el código siguiente funciona, es un uso indebido de try/catch para usarlo no para detectar un error sino para determinar un valor.

¿Hay alguna forma mejor de hacerlo en C# 3?

public static bool IsAValidInteger(string strWholeNumber) 
{ 
    try 
    { 
     int wholeNumber = Convert.ToInt32(strWholeNumber); 
     return true; 
    } 
    catch 
    { 
     return false; 
    } 
} 

Respuesta:

respuesta de Juan a continuación me ayudó a construir la función que estaba buscando sin el try/catch. En este caso, un cuadro de texto en blanco también se considera un "número entero" válida en mi forma:

public static bool IsAValidWholeNumber(string questionalWholeNumber) 
{ 
    int result; 

    if (questionalWholeNumber.Trim() == "" || int.TryParse(questionalWholeNumber, out result)) 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

Respuesta

33
if (int.TryParse(string, out result)) 
{ 
    // use result here 
} 
+2

Y long.TryParse para valores de 64 bits también. – devstuff

5

Int32.TryParse

11

Esto probablemente no será mucho más rápido, pero por lo menos se ve más limpia (sin manejo de excepciones):

public static bool IsAValidInteger(string strWholeNumber) 
{ 
    int wholeNumber; 
    return int.TryParse(strWholeNumber, out wholeNumber); 
} 
+2

En realidad, será significativamente más rápido para situaciones en las que repetidamente obtiene cadenas inválidas. –

+3

Yo sospechaba eso. Estaba a punto de probarlo ... pero no tiene sentido ahora porque desde que Jon Skeet lo ha confirmado :-) –

6

Usted está buscando Int32.TryParse().

public void Foo(String input) 
{ 
    Int32 number; 
    if (Int32.TryParse(input, out number)) 
    { 
     DoStuff(number); 
    } 
    else 
    { 
     HandleInvalidInput(input); 
    } 
} 

En su caso específico usaría lo siguiente.

public static Boolean IsValidInt32(String input) 
{ 
    Int32 number; 
    return Int32.TryParse(input, out number); 
} 
-4

El enfoque try/catch es una solución válida porque para muchos tipos no hay métodos TryParse implementados. Entonces vuelves a la opción básicamente que queda.

+0

Esto no responde a la pregunta (es decir, cadena a entero). –

+0

Lo hace. Le dice al autor que no hay mejor opción. – User

+0

En realidad, para enteros hay una mejor opción que otros mencionaron. – Residuum

Cuestiones relacionadas