2010-01-19 13 views

Respuesta

10
double n; 
if (Double.TryParse("128337.812738", out n)) { 
    // ok 
} 

obras asumiendo el número no se desborde un doble

para una gran cadena, tratar la expresión regular:

if (Regex.Match(str, @"^[0-9]+(\.[0-9]+)?$")) { 
    // ok 
} 

añadir en notación científica (E/E) o +/- signos, si es necesario ...

+0

lo que debería ser el parámetro? ¿Aceptará una cadena enorme? ¿hay alguna limitación? – Maneesh

+0

para una cadena enorme necesitas una expresión regular – jspcal

+0

¡Gracias a la solución reg Exp funciona! Gracias jspcal – Maneesh

0

creo que se puede utilizar expresiones regulares, en la clase Regex

Regex.IsMatch (yourStr, "\ d")

o algo así en la parte superior de mi cabeza.

O usted podría utilizar el int.Parse método Parse (...)

-1

Esto debería funcionar:

bool isNum = Integer.TryParse(Str, out Num); 
+0

Int.TryParse fallará en su tercer caso de prueba de "123.67" – ZombieSheep

3

Puede utilizar double.TryParse

string value; 
double number; 

if (Double.TryParse(value, out number)) 
    Console.WriteLine("valid"); 
else 
    Console.WriteLine("invalid"); 
2

Tomado de MSDN (Cómo para implementar la funcionalidad Visual Basic .NET IsNumeric mediante el uso de Visual C#):

// IsNumeric Function 
static bool IsNumeric(object Expression) 
{ 
    // Variable to collect the Return value of the TryParse method. 
    bool isNum; 

    // Define variable to collect out parameter of the TryParse method. If the conversion fails, the out parameter is zero. 
    double retNum; 

    // The TryParse method converts a string in a specified style and culture-specific format to its double-precision floating point number equivalent. 
    // The TryParse method does not generate an exception if the conversion fails. If the conversion passes, True is returned. If it does not, False is returned. 
    isNum = Double.TryParse(Convert.ToString(Expression), System.Globalization.NumberStyles.Any, System.Globalization.NumberFormatInfo.InvariantInfo, out retNum); 
    return isNum; 
} 
2

Esto debería funcionar sin importar el tiempo la cadena es:

string s = "12345"; 
bool iAllNumbers = s.ToCharArray().All (ch => Char.IsDigit (ch) || ch == '.'); 
+0

Eso también coincidiría con "123.456.789", que no es un número válido –

+0

@Philippe: Tiene razón. Creo que el RegExp es la manera más limpia de ir aquí. – Tarydon

+0

@Tarydon System.Array no contiene una definición para All?! – Alex

2

Uso de expresiones regulares es la forma más fácil (pero no el más rápido):

bool isNumeric = Regex.IsMatch(s,@"^(\+|-)?\d+(\.\d+)?$"); 
+0

Te estás perdiendo el caso '.23'. – leppie

+0

Posiblemente, si desea permitir números que fueron utilizados por las computadoras Commodore 64 hace 25 años :-) –

+0

Lo siento amigo, pero C# también lo acepta, al igual que Scheme, y la mayoría de los idiomas con IEEE punto flotante :) – leppie

0

Si está recibiendo la cadena como un parámetro, la forma más flexible sería usar expresiones regulares como se describe en las otras publicaciones. Si recibe la información del usuario, puede conectar el evento KeyDown e ignorar todas las claves que no son números. De esta forma, estarás seguro de que solo tienes dígitos.

1

Como se ha dicho anteriormente se puede utilizar Double.TryParse

Si no lo hace así (por alguna razón), se puede escribir su propio método de extensión:

public static class ExtensionMethods 
    { 
     public static bool isNumeric (this string str) 
     { 
      for (int i = 0; i < str.Length; i++) 
      { 
       if ((str[i] == '.') || (str[i] == ',')) continue; //Decide what is valid, decimal point or decimal coma 
       if ((str[i] < '0') || (str[i] > '9')) return false; 
      } 

      return true; 
     } 
    } 

Uso:

string mystring = "123456abcd123"; 

if (mystring.isNumeric()) MessageBox.Show("The input string is a number."); 
else MessageBox.Show("The input string is not a number."); 

de entrada:

1234 56abcd123

123.6

Salida:

falsa

cierto

Cuestiones relacionadas