Como posso validar a input do console como números inteiros?

Eu escrevi meus códigos e quero validá-lo de tal forma que ele só permita que os interagentes sejam inseridos e não alfabetos. Aqui está o código, por favor, eu vou te amar para me ajudar. Obrigado.

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace minimum { class Program { static void Main(string[] args) { int a = Convert.ToInt32(Console.ReadLine()); int b = Convert.ToInt32(Console.ReadLine()); int c = Convert.ToInt32(Console.ReadLine()); if (a < b) { if (a < c) { Console.WriteLine(a + "is the minimum number"); } } if (b < a) { if (b < c) { Console.WriteLine(b + "is the minimum number"); } } if (c < a) { if (c < b) { Console.WriteLine(c + "is the minimum number"); } } Console.ReadLine(); } } } 

Você deve testar se é um int em vez de converter imediatamente. Tente algo como:

 string line = Console.ReadLine(); int value; if (int.TryParse(line, out value)) { // this is an int // do you minimum number check here } else { // this is not an int } 

Simplesmente chame Readline () e faça um loop com Int.TryParse até que o usuário insira um número válido 🙂

 int X; String Result = Console.ReadLine(); while(!Int32.TryParse(Result, out X)) { Console.WriteLine("Not a valid number, try again."); Result = Console.ReadLine(); } 

espero que ajude

Para obter o console para filtrar pressionamentos de tecla alfabéticos você tem que assumir a análise de input. O método Console.ReadKey () é fundamental para isso, permite que você cheire a tecla pressionada. Aqui está uma implementação de amostra:

  static string ReadNumber() { var buf = new StringBuilder(); for (; ; ) { var key = Console.ReadKey(true); if (key.Key == ConsoleKey.Enter && buf.Length > 0) { return buf.ToString() ; } else if (key.Key == ConsoleKey.Backspace && buf.Length > 0) { buf.Remove(buf.Length-1, 1); Console.Write("\b \b"); } else if ("0123456789.-".Contains(key.KeyChar)) { buf.Append(key.KeyChar); Console.Write(key.KeyChar); } else { Console.Beep(); } } } 

Você poderia adicionar, por exemplo, Decimal.TryParse () na instrução if () que detecta a tecla Enter para verificar se a string inserida ainda é um número válido. Dessa forma, você pode rejeitar a input como “1-2”.

Não converta a input do usuário imediatamente. Coloque-o em uma string e use Int32.TryParse (…) para descobrir se um número foi typescript ou não. Como isso:

 int i; string input = Console.ReadLine(); if(Int32.TryParse(input, out i)) { // it is a number and it is stored in i } else { // it is not a number } 

Observe que

 if (a < b) { if (a < c) { 

é equivalente a

 if (a < b && a < c) { 

e que esta última forma introduz menos aninhamento e é mais legível, particularmente se seu código ficar mais complexo. Além disso, você provavelmente nunca deve usar Convert.ToInt32 - tem um caso de canto particularmente mal concebido e surpreendente; e também é menos seguro para o tipo do que o int.Parse que é a melhor opção, quando possível - ou int.TryParse quando não tiver certeza se a string é válida. Basicamente, evite Convert.... sempre que possível.

  string Temp; int tempInt,a; bool result=false; while ( result == false ) { Console.Write ("\n Enter A Number : "); Temp = Console.ReadLine (); result = int.TryParse (Temp, out tempInt); if ( result == false ) { Console.Write ("\n Please Enter Numbers Only."); } else { a=tempInt; break; } } 

Minha solução preferida seria:

 static void Main() { Console.WriteLine( ( from line in Generate(()=>Console.ReadLine()).Take(3) let val = ParseAsInt(line) where val.HasValue select val.Value ).Min() ); } static IEnumerable Generate(Func generator) { while(true) yield return generator(); } static int? ParseAsInt(string str) { int retval; return int.TryParse(str,out retval) ? retval : default(int?); } 

Obviamente, dependendo da especificação (se o número inválido for repetido?), Talvez seja necessário ajustá-lo.

Duplo / Flutuante:

Estou apenas estendendo a resposta do @Hans Passant (Cuidando do DecimalSeparator e “-“):

  static double ReadNumber() { var buf = new StringBuilder(); for (; ; ) { var key = Console.ReadKey(true); if (key.Key == ConsoleKey.Enter && buf.Length > 0) { Console.WriteLine(); return Convert.ToDouble(buf.ToString()); } else if (key.Key == ConsoleKey.Backspace && buf.Length > 0) { buf.Remove(buf.Length - 1, 1); Console.Write("\b \b"); } else if (System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator.Contains(key.KeyChar) && buf.ToString().IndexOf(System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator) == -1) { buf.Append(key.KeyChar); Console.Write(key.KeyChar); } else if ("-".Contains(key.KeyChar) && buf.ToString().IndexOf("-") == -1 && buf.ToString() == "") { buf.Append(key.KeyChar); Console.Write(key.KeyChar); } else if ("0123456789".Contains(key.KeyChar)) { buf.Append(key.KeyChar); Console.Write(key.KeyChar); } else { Console.Beep(); } } } 

Experimente este simples

 try { string x= "aaa"; Convert.ToInt16(x); //if success is integer not go to catch } catch { //if not integer return; }