Pregunta

Tengo las siguientes variables:

string str1 = "1";
string str2 = "asd";
string str3 = "3.5";
string str4 = "a";

Ahora necesito encontrar el tipo de datos de cada cadena, es decir, el tipo de datos al que se pueden convertir si se eliminan las comillas. Esto es lo que me gustaría que convirtiera cada variable:

  

str1 - entero
  str2 - cadena
  str3 - doble
  str4 - char

Nota: si la cadena tiene un solo carácter, debe ser char, aunque una cadena puede tener una sola letra, la estoy limitando.

FYI: estos valores se obtienen de DataGrid donde ingresé valores manualmente. Así que todo se está convirtiendo en una cuerda. ¿Hay alguna manera de hacer esto?

¿Fue útil?

Solución

Usa metadatos , si puedes

No es una buena idea tener que adivinar cuáles son los tipos de datos.

Dos cosas

1 ¿De dónde vienen los datos?

Si es una base de datos, ¿estás seguro de que son cadenas? Si se trata de una base de datos, deberían devolverse algunos metadatos que le indicarán cuáles son los tipos de datos de los campos.

Si se trata de un archivo Xml, ¿hay un esquema definido que le dará los tipos?

2 Si tienes que seguir adivinando.

Tenga en cuenta que puede tener cadenas que son números, pero son cadenas perfectamente válidas, por ejemplo, números de teléfono, números de cuentas bancarias, que se expresan mejor como cadenas. Además, estos números pueden tener muchos dígitos, si los convierte a dobles, puede perder algunos dígitos a imprecisiones de punto flotante (debe estar bien hasta 14 o 15 dígitos)

Estoy seguro a estas alturas, porque me tomé mi tiempo para escribir esto. Hay muchas respuestas que te dicen cómo hacerlo (es decir, primero tryparse int, luego doble, luego prueba la longitud de char, si no, entonces es una cadena, etc.), pero si fuera usted, trataría de NO hacer eso y ver si hay alguna manera de obtener, o pasar algunos metadatos que le dirán qué tipo es y no solo el tipo podría ser

Otros consejos

Por supuesto, no hay una forma definitiva de hacer esto, pero si crea una lista de tipos de datos que desea verificar ordenados por prioridad, algo como esto puede hacer el truco.

object ParseString(string str)
{
    int intValue;
    double doubleValue;
    char charValue;
    bool boolValue;

    // Place checks higher if if-else statement to give higher priority to type.
    if (int.TryParse(str, out intValue))
        return intValue;
    else if (double.TryParse(str, out doubleValue))
        return doubleValue;
    else if (char.TryParse(str, out charValue))
        return charValue;
    else if (bool.TryParse(str, out boolValue))
        return boolValue;

    return null;
}

Simplemente llame a esta función en cada cadena, y debería tener el tipo de objeto apropiado devuelto. Una simple comprobación de tipo puede indicarle cómo se analizó la cadena.

Utilice el método TryParse de cada tipo.

No hay una forma integrada de hacer esto, puedes intentar TryParse en tipos de números con una precisión cada vez mayor, pero no garantizaría que sea correcto.

Lo mejor que puedes hacer es procesarlo como lo harías manualmente. es decir, ¿hay un lugar decimal? No, entonces es un número entero. ¿Cuan grande? ¿Es negativo?

El tipo de datos para cada uno de estos elementos es una cadena. Si desea intentar analizarlos en diferentes tipos, puede usar Int32.TryParse, Double.TryParse, etc. O puede usar Regex:

bool isInt = new Regex(@"^\d+<*>quot;).IsMatch(str);
bool isDouble = !(isInt) && new Regex(@"^\d+\.\d+<*>quot;).IsMatch(str);
bool isChar = !(isInt || isDouble) && new Regex(@"^.<*>quot;).IsMatch(str);
bool isString = !(isInt || isDouble || isChar);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top