Pergunta

Eu tenho as seguintes variáveis:

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

Agora eu preciso encontrar o tipo de dados de cada corda ou seja, o tipo de dados para que ele pode ser convertido se aspas são removidos. Aqui está o que eu gostaria que cada variável para converter em:

str1 - inteiro
str2 - corda
str3 - double
str4 - caractere

Nota:. Se a cadeia tem um carácter único, deve ser char, embora uma corda pode ter única letra, eu estou limitando-

FYI: estes valores são obtidos a partir DataGrid onde eu inseridos manualmente valores. Então, tudo está se tornando uma string. Existe alguma maneira de fazer isso?

Foi útil?

Solução

Use meta-dados , se você puder

Que você tem que adivinhar o que os tipos de dados são, não é uma boa idéia.

Duas coisas

1 Onde está os dados vem?

Se é um banco de dados, você tem certeza que eles estão cordas? Se for um banco de dados, deve haver alguns meta dados retornou que vai dizer o que os tipos de dados dos campos são.

Se é um arquivo XML, há um esquema definido que vai lhe dar os tipos?

2 Se você tem que continuar a adivinhar.

Esteja ciente de que você pode ter cordas que acontecerá a ser números, mas são perfeitamente cadeias válidas v.g. números de telefone, números de conta bancária, que são melhor expressa como strings. Também estes números podem ter muitos dígitos, se você convertê-los em duplas, poderá perder alguns dígitos a imprecisões ponto flutuante (você deve estar OK até 14 ou 15 dígitos)

Eu tenho certeza que até agora - porque eu tenho tomado o meu tempo digitando este - há muitas respostas dizendo a você como fazer isso (ou seja TryParse int em primeiro lugar, em seguida, em seguida, comprimento de teste para char, se não for, então é uma corda etc), mas se eu fosse você, eu ia tentar não fazer isso, e ver se há alguma maneira você pode obter, ou passar alguns meta-dados que lhe dirá que tipo ele é e não apenas de que tipo pode ser

Outras dicas

Claro, não há nenhuma maneira definitiva para fazer isso, mas se você criar uma lista de tipos de dados que pretende verificar ordenados por prioridade, então algo como isto pode fazer o truque.

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;
}

Apenas chamar esta função em cada corda, e você deve ter o tipo apropriado de objeto retornado. Uma verificação de tipo simples pode, então, dizer-lhe como a cadeia foi analisado.

Use o método TryParse de cada tipo.

Não há construído em forma de fazer isso, você poderia tentar TryParse em tipos de números com precisão crescente, mas não seria uma garantia de que ele seja certo.

Sua melhor aposta que ser para processá-lo, como você faria manualmente. ou seja Existe uma casa decimal? Não - então é um inteiro. Quão grande? É negativo?

O tipo de dados para cada um desses itens é string. Se você quiser tentar analisá-los em diferentes tipos que você pode usar Int32.TryParse, Double.TryParse, etc. Ou você pode usar Regex:

bool isInt = new Regex(@"^\d+$").IsMatch(str);
bool isDouble = !(isInt) && new Regex(@"^\d+\.\d+$").IsMatch(str);
bool isChar = !(isInt || isDouble) && new Regex(@"^.$").IsMatch(str);
bool isString = !(isInt || isDouble || isChar);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top