2009-10-02 12 views
5

? Tengo curiosidad por saber por qué el equipo de lenguaje C# no ha proporcionado una función IsNumeric en el objeto String ?. La función IsNumeric hubiera sido más adecuada en un objeto String que la función Int32.TryParse.¿Por qué no hay una función String.IsNumeric en C#

Nota: ¡Estoy haciendo esta pregunta porque me ha resultado difícil explicar esto a un principiante y no me gusta que maldigan a C# por esto!

Actualización: Por favor, esta pregunta no trata de cómo implementar una función IsNumeric.

+4

Puede agregarlo como método de extensión. :) –

+0

Conozco el método de extensión, pero esa no es la pregunta aquí, pero gracias de todos modos (-: – pradeeptp

Respuesta

17

El problema con un método como ese sería decidir qué cuenta como "numérico". ¿Debería permitir puntos de decimales, debería permitir espacios en blanco iniciales, debería tener un límite superior para la cantidad de dígitos?

Int32.TryParse responde a la pregunta mucho más definida de, "¿es esta una representación de cadena válida de un Int32?"

Y, por supuesto, nada le impide escribir su propio método de extensión, que decide si una cadena es numérica de acuerdo con sus propias reglas.

+0

Esto no ha detenido a MS poniendo estos métodos en el tipo de datos Char. –

+5

Esto se debe a que un carácter individual es un carácter numérico o no, por lo que dicho método tiene sentido – RobV

4

Porque puede haber un montón de funciones que uno puede encontrar útiles y absolutamente necesarias.

IsNumeric() 
IsAlpha() 
IsAlphaNumeric() 
IsEmailAddress() 
IsGuid() 
... 

Y así sucesivamente. Cualquier persona puede agregar fácilmente una docena más de métodos que él consideraría absolutamente necesarios. Un marco solo pretende ser genérico y proporcionar las herramientas básicas para que pueda hacer su trabajo y tal vez para construir sus herramientas adicionales según sea necesario.

Dicho esto, simplemente agregue sus métodos de extensión.

+0

Siento que la función IsNumeric es algo que hemos crecido usando en otros lenguajes.Y creo que esto era absolutamente necesario, a menos que quieras que sea un experto que tenga un conocimiento profundo de funciones alternativas en otros objetos. – pradeeptp

3

Tiene que haber una línea en algún lugar, entre los métodos que pone en una clase y las operaciones que son mejor realizadas por otras clases.

Si hubiera un método IsNumeric, otras personas podrían solicitar un IsValidPhoneNumber, IsValidEmailAddress, IsValidURI o incluso IsValidZipCodeInNewZealand métodos ... todos estos podrían implementarse mejor en su propio dominio.

+0

@Timbo Si observa la cantidad de preguntas sobre la función IsNumeric en otro lugar de Internet, entenderá por qué hice esta pregunta. Esta es una función común que a la mayoría de los desarrolladores les gustaría ver en el objeto String. Para aquellos que provienen de otros idiomas/herramientas como VB6, ¡esperarían que esté disponible en String object! – pradeeptp

1

IIRC no hay Char.IsDigit (char c);

por lo tanto pienso que debería funcionar:

string _temp = "12341234"; 
bool _isNumeric = _temp.ToCharArray().All(x => Char.IsDigit(x)); 

y se podía concluir que, como los métodos de extensión, si quieres.

+0

Desafortunadamente, esto no funciona para números negativos, o un formato numérico más sofisticado dependiendo de la configuración de localización del usuario actual. – Timbo

+0

Si solo permite números naturales sin espacio inicial o final, su expresión tiene sentido. Entonces todo depende de lo que defina como "numérico". –

0

En una nota lateral: Siempre se puede poner en práctica su propia:

public static class StringExtensions 
{ 
    public static Boolean IsNumeric(this String s) 
    { 
     // your own definition goes here 
    } 
} 
3

Creo que la lógica detrás de Int32.TryParse es que la clase Int32 sabe lo que es un válido entero de 32 bits mientras que la clase String no tiene noción de lo que es un número en absoluto.

El principio detrás de eso es que un objeto puede verificar mejor si algo se puede tratar/convertir a ese objeto específico.

Cuestiones relacionadas