Pergunta

Oh, 2 coisas: 1) É um aplicativo de console. 2) Eu sei que é em dinamarquês, mas realmente não importa, é apenas um exemplo de pedir alguma entrada. O texto e as variáveis ??não importa.

Tudo bem, considere esta entrada simples: Poderia ser qualquer tipo de pergunta de entrada realmente.

Console.WriteLine("Hvad er dit kundenummer: (Kun hele tal tilladt)");
string inputKnr = Console.ReadLine();
kundenummer = Convert.ToInt16(inputKnr);

Agora, e se a algo de errado tipos de clientes? Como uma carta. A tentativa e captura faria se o aplicativo não quebrar, mas isso não é a solução que eu quero. Eu quero dizer que você fez isso errado, tente novamente. direito bastante clássico?

Mas o que é a melhor maneira de resolver esta solução? Tenho pensado nisso:

bool fangetKundenummer = true;
while (fangetKundenummer)
{
Console.WriteLine("Hvad er dit kundenummer: (Kun hele tal tilladt)");
string inputKnr = Console.ReadLine();
try
{
    kundenummer = Convert.ToInt16(inputKnr);
    fangetKundenummer = false;
}
catch
{
    Console.WriteLine("Fejl. Prøv igen");
}
}

Mas isso só não parece ser o caminho certo para fazê-lo.

Além disso, apenas para mencionar isso, este pequeno aplicativo que eu estou jogando com tem 4 entrada perguntas em uma fileira . Isto significaria 4 vezes isso enquanto desagradável () loop.

Você também pode escrever uma função. Algo parecido com isto (não há razão para fazê-lo da maneira certa, é apenas para ilustrar um conceito):

static void verifyInput()
{
    try
    {
        Console.WriteLine("question");
        input = Console.ReadLine();
        kundenummer = Convert.ToInt16(input)
    }
    catch
    {
        Console.WriteLine("Wrong. Do it over");
        verifyInput(); //start the function all over
    }
}

Mas você teria que escrever uma função para cada pergunta de entrada, mesmo que eles possam perguntar exatamente para o mesmo! (Ou seja, talvez todos pedindo um inteiro, mas com uma pergunta diferente e variável).

Esta não parece muito melhor do que a solução while ().

Alguém tem uma idéia inteligente?

Foi útil?

Solução

Use Int16.TryParse e os equivalentes para outros tipos numéricos. Todos estes retorno um resultado booleano para indicar sucesso ou fracasso para análise, e ter um parâmetro out que é definido para o resultado da análise (ou 0 em caso de falha). No seu caso, você pode querer envolver a chamada em um método para ficar a perguntar:

static Int16 PromptForInt16(string prompt)
{
    while (true)
    {
        Console.Write(prompt);
        Int16 result;
        if (Int16.TryParse(Console.ReadLine(), out result))
        {
            return result;
        }
        Console.WriteLine("Sorry, invalid number entered. Try again.");
    }
}

Outras dicas

Você pode usar o padrão TryParse:

string s; // for "is not valid" message
short val; // final value
while(!short.TryParse(s=Console.ReadLine(), out val)) {
    Console.WriteLine(s + " is not valid...");
}

Apenas para alguns variedade, que tal testar a corda em si, em vez de TryParse, o que exigiria armazenamento extra e, potencialmente, um elenco desnecessários?

static void Main(string[] args)
{
    var isFalse = "t".IsInt();
    var isTrue = "123".IsInt();
    var isAlsoFalse = "123.1".IsInt();

}

static bool IsInt(this IEnumerable<char> s)
{
    return s.All(x => char.IsNumber(x));
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top