Pregunta

Tengo una cadena y quiero comprobar que sólo se compone de dígitos. Realmente no quiero (o necesito) analizar ni nada, sólo quiero saber que no contiene nada más que cifras (y ningún separador de punto flotante o, simplemente dígitos).

PHP tiene este bonito función llamada ctype_digit . ¿Hay algo similar para C # en cualquier parte del .Net Framework? O tengo que usar una expresión regular o algo por el estilo?

Creación de una expresión regular para este supuesto, sería bastante simple, pero me gustaría que lo use si hay mejores maneras: p

¿Fue útil?

Solución 2

La respuesta de @ Bruno Conde me hizo pensar en esto: D

if(subject.All(char.IsDigit))
    // Do something

No se puede creer que no haya ocurrido antes ...

Otros consejos

Se puede usar int.TryParse . Se devolverá verdadero si la cadena suministrada representa un número válido, en caso contrario. No se olvide de utilizar NumerStyles.None para no permitir espacios en blanco y el signo más / menos.

Actualizar : Como dice Empi, esto no funcionará para las grandes cadenas. Si tiene arbitrariamente grandes cadenas, tal vez una expresión regular es su única opción. Se podría hacer algo como Regex.IsMatch(theString,"^[0-9]+$")

bool onlyDigits = "1234".All(c => char.IsDigit(c));

Me parece, que sería mejor usar expresiones regulares para hacer el trabajo para usted ... "\ d +" debe hacerlo ... bien, usted ha dicho que no quiere usarlo ... pero es a prueba de tontos forma de asegurar la cadena contiene sólo números, entonces, si la expresión regular pasa, entonces usted puede utilizar int.Parse (...) inmediatamente.

Sí, puede utilizar

bool Int32.TryParse(string s, out int result);

Ejemplo de código:

string myString = "1265";
int myInt;

if (Int32.TryParse(myString,myInt) // Returns true if mystring contains only digits
{
...
}

Otra opción es utilizar expresiones regulares:

    public static bool IsDigit(string myString)
    {
        string pattern = @"^\d*$";

        if (Regex.IsMatch(myString, pattern))
            return true;
        else
            return false;
    }

Puede cambiar el patrón según sus necesidades.

No hay ningún método incorporado. Int32.TryParse o Int64.TryParse no funcionarán para las cadenas muy largas que contienen sólo números (que también pueden permitir que otros caracteres utilizados para representar números enteros).

Como otras personas han dicho, puede utilizar el método int.TryParse, aunque menos que su número es muy, muy extremadamente grande, puede utilizar el método TryParse de otros tipos, que tienen un rango más grande que de Int32. (Por supuesto utilizando la opción NumberStyles.None, para evitar los signos y puntuacion).

Aquí está el desglose:

  1. int -2147483648 2147483647 ..
  2. uint 0 .. 4294967295
  3. long -9.223.372.036.854.775.808 .. 9.223.372.036.854.775.807
  4. ulong 0 .. 18.446.744.073.709.551.615
  5. float -3.402823e38 .. 3.402823e38
  6. double -1.79769313486232e308 .. 1.79769313486232e308
  7. decimal -79228162514264337593543950335 .. 79228162514264337593543950335

El único que puede analizar los grandes números es Double. Si es necesario utilizar el número, perderá algo de precisión, pero se puede analizar números muy largos (aunque se dice que no tienes que usarlo por lo que no debería ser un problema). En una prueba rápida que hice, se las arregló para analizar correctamente la cadena siguiente:

79228162514264337593543950335792281625142643375935439503357922816251426433759354395033579228162514264337593543950335792281625142643375935439503357922816251426433759354395033579228162514264337593543950335792281625142643375935439503357922816251426433759354395033579228162514264337593543950335234234234234243423

(eso es 308 caracteres, sería un error con un número más)

Sin embargo, si no se va a utilizar el número, podría ser una exageración, por lo que iría por la expresión regular, o mejor aún el bucle de comprobar que cada carácter es un dígito.

Si luego quiere ir un poco loco que se puede dividir en varias cadenas más pequeñas, y utiliza la biblioteca de tareas para comprobar que de forma paralela: P

(Sé que es un poco offtopic, pero si usted quiere hacer eso, usted debe comprobar parallel.for y la Partition Ranger, echa un vistazo a este vídeo de 10 minutos C9: paralelo para la partición guardabosques )

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top