Melhor maneira de verificar a entrada readline em C #?
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?
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));
}
Aqui está um link que pode ajudar:
http://msdn.microsoft.com/en -us / library / system.int16.tryparse.aspx