2012-03-21 12 views

Respuesta

7

Existe el método TryParse, que devuelve un bool que indica si la conversión fue exitosa.

+0

Parece que este sería probablemente la mejor opción que hay, gracias .... – user1202606

+0

El 'TryParse 'método no dará los mismos resultados que' IsNumeric'. – phoog

70

Se puede escribir un método de extensión:

public static class Extension 
{ 
    public static bool IsNumeric(this string s) 
    { 
     float output; 
     return float.TryParse(s, out output); 
    } 
} 
+8

Prefiero llamar a ese método 'IsInteger'. Numérico es bastante ambiguo. – CodesInChaos

+3

@CodeInChaos - seguro, por qué no. Yo tampoco llamaría a la extensión de clase, estaba más preocupado con la idea. –

+0

Este método devuelve 'false' para varias clases de cadena para las cuales' IsNumeric' devuelve 'true'. – phoog

14

que puedes usar TryParse - Parse una excepción si la cadena no es un número válido - por ejemplo, Si desea probar un número entero válido:

int v; 
if (Int32.TryParse(textMyText.Text.Trim(), out v)) { 
    . . . 
} 

Si desea probar un número de coma flotante válido:

double v; 
if (Double.TryParse(textMyText.Text.Trim(), out v)) { 
    . . . 
} 

Nótese también que Double.TryParse tiene una versión sobrecargada con parámetros adicionales especificando diferentes reglas y opciones que controlan el proceso de análisis - por ejemplo localización ('.' o ',') - vea http://msdn.microsoft.com/en-us/library/3s27fasw.aspx.

+0

'Int32.TryParse' devuelve' false' para '1E2', por ejemplo, mientras' IsNumeric' devuelve 'true'. – phoog

+0

Luego está 'Double.TryParse' - Estoy actualizando mi respuesta – MiMo

+0

Según la documentación, Parse y TryParse ignoran los espacios en blanco. Esto hace innecesario el Trim(). https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/types/how-to-convert-a-string-to-a-number – Asimov

14

Creo que necesita algo un poco más genérico. Pruebe esto:

public static System.Boolean IsNumeric (System.Object Expression) 
{ 
    if(Expression == null || Expression is DateTime) 
     return false; 

    if(Expression is Int16 || Expression is Int32 || Expression is Int64 || Expression is Decimal || Expression is Single || Expression is Double || Expression is Boolean) 
     return true; 

    try 
    { 
     if(Expression is string) 
      Double.Parse(Expression as string); 
     else 
      Double.Parse(Expression.ToString()); 
      return true; 
     } catch {} // just dismiss errors but return false 
     return false; 
    } 
} 

Hope it helps!

+0

Esta es una respuesta mucho mejor que todas las demás , pero todavía no coincide con la funcionalidad de 'IsNumeric'. – phoog

+3

Me gusta el enfoque para verificar primero el tipo de datos, pero sugiero modificar la segunda parte del código usando 'Double tmp; var isSuccess = Double.TryParse (expresión como cadena, salida tmp); return isSuccess; 'en lugar del bloque try-catch circundante. – Matt

1

Debe usar el método TryParse que convierte la representación de cadena de un número en su entero equivalente a 32 bits con signo. Un valor de retorno indica si la conversión tuvo éxito.

int intParsed; 
    if(int.TryParse(txtMyText.Text.Trim(),out intParsed)) 
    { 
     // perform your code 
    } 
+0

'int.TryParse' devuelve false para' "$ 100" 'y' "1E2" ', mientras que' IsNumeric' devuelve verdadero. – phoog

+0

Puede usar un método Int32.TryParse sobrecargado (String, NumberStyles, IFormatProvider, Int32%) para especificar la moneda o el exponente. http://msdn.microsoft.com/en-us/library/zf50za27(v=vs.90).aspx – DotNetUser

1

Hay una forma un poco mejor:

int valueParsed; 
if(Int32.TryParse(txtMyText.Text.Trim(), out valueParsed)) 
{ ... } 

Si intenta analizar el texto y que no se puede analizar, el método Int32.Parse lanzará una excepción. Creo que es mejor para ti usar el método TryParse que capturará la excepción y te avisará como booleano si se encuentra alguna excepción.

Hay muchas complicaciones en el análisis de texto que Int32.Parse tiene en cuenta. Es tonto duplicar el esfuerzo. Como tal, este es muy probablemente el enfoque adoptado por IsNumeric de VB. También puede personalizar las reglas de análisis a través de la enumeración NumberStyles para permitir hex, decimal, moneda y algunos otros estilos.

Otro enfoque común para las aplicaciones que no están basadas en la web es restringir la entrada del cuadro de texto para que solo acepte caracteres que se puedan analizar en un entero.

EDIT: Puede aceptar una mayor variedad de formatos de entrada, tales como los valores del dinero ("$ 100") y exponentes ("1E4"), especificando los NumberStyles específicos:

int valueParsed; 
if(Int32.TryParse(txtMyText.Text.Trim(), NumberStyles.AllowCurrencySymbol | NumberStyles.AllowExponent, CultureInfo.CurrentCulture, out valueParsed)) 
{ ... } 

... o permitiendo cualquier tipo de formato soportado:

int valueParsed; 
if(Int32.TryParse(txtMyText.Text.Trim(), NumberStyles.Any, CultureInfo.CurrentCulture, out valueParsed)) 
{ ... } 
+0

'IsNumeric' devuelve' true' para cadenas como '" 1E2 "' y '" $ 100 "', mientras 'Int32.TryParse' devuelve false para esas cadenas. – phoog

+0

@phoog el comportamiento predeterminado es no admitir notación científica o valores monetarios. puede ajustar el comportamiento pasando una combinación de opciones de NumberStyles, como por ejemplo: Int32.TryParse ("1E2", NumberStyles.AllowCurrencySymbol | NumberStyles.AllowExponent, CultureInfo.CurrentCulture, out valueParsed). También puede especificar NumberStyles.Any, que es probablemente lo que VB IsNumeric hace detrás de las escenas. – Scott

+1

por supuesto, pero si tuviera un requerimiento para duplicar la funcionalidad de 'IsNumeric' en un proyecto de C#, simplemente llamaría' IsNumeric' en lugar de escribir un nuevo código de C# y tratar de asegurarme de haber cubierto todos los casos de esquina correctamente. – phoog

8

Otras respuestas han sugerido el uso de TryParse, que podrían ajustarse a sus necesidades, pero la forma más segura para proporcionar la funcionalidad de la función IsNumeric es hacer referencia a la biblioteca de VB y utilizar el IsNumeric función.

IsNumeric es más flexible que TryParse. Por ejemplo, IsNumeric devuelve true para la cadena "$100", mientras que los métodos TryParse todos devuelven false.

Para usar IsNumeric en C#, agregue una referencia a Microsoft.VisualBasic.dll. La función es un método estático de la clase Microsoft.VisualBasic.Information, por lo que suponiendo que tiene using Microsoft.VisualBasic;, usted puede hacer esto:

if (Information.IsNumeric(txtMyText.Text.Trim())) //... 
+5

No estoy seguro de que me gustaría que el resultado "verdadero" para '" $ 100 "' sea numérico? – cederlof

+4

@cederlof No estoy seguro de que lo haría, a menos que intente replicar la función 'IsNumeric' de Visual Basic, que se menciona en la pregunta. Esa función devuelve verdadera para "$ 100". Si intenta reproducir el comportamiento de un procedimiento de Excel VBA, por ejemplo, querría que la función devuelva verdadero para "$ 100" y probablemente sería mejor usar Microsoft.VisualBasic.dll que tratar de escribir su propio reemplazo. función. – phoog