Lendo um inteiro da input do usuário

O que eu estou procurando é como ler um inteiro que foi dado pelo usuário a partir da linha de comando (projeto de console). Eu principalmente sei C ++ e iniciei o caminho C #. Eu sei que Console.ReadLine (); leva apenas um caractere / string. Então, em suma, estou procurando a versão inteira disso.

Só para você ter uma ideia do que estou fazendo exatamente:

Console.WriteLine("1. Add account."); Console.WriteLine("Enter choice: "); Console.ReadLine(); // Needs to take in int rather than string or char. 

Eu tenho procurado por um bom tempo para isso. Eu encontrei muito em C, mas não em C #. Eu encontrei no entanto um segmento, em outro site, que sugeriu converter de char para int. Tenho certeza de que tem que haver uma maneira mais direta do que a conversão.

Você pode converter a string para inteiro usando a function Convert.ToInt32 ()

 int intTemp = Convert.ToInt32(Console.ReadLine()); 

Eu sugiro que você use TryParse :

 Console.WriteLine("1. Add account."); Console.WriteLine("Enter choice: "); string input = Console.ReadLine(); int number; Int32.TryParse(input, out number); 

Desta forma, seu aplicativo não lança uma exceção, se você tentar analisar algo como “1q” ou “23e”, porque alguém fez uma input com defeito.

Int32.TryParse retorna um valor booleano, para que você possa usá-lo em uma instrução if , para ver se precisa ou não de ramificação de seu código:

 int number; if(!Int32.TryParse(input, out number)) { //no, not able to parse, repeat, throw exception, use fallback value? } 

Para sua pergunta: Você não encontrará uma solução para ler um inteiro porque ReadLine() lê toda a linha de comando, e então retorna uma string. O que você pode fazer é tentar converter essa input em uma variável int16 / 32/64.

Existem vários methods para isso:

  • Int.Parse ()
  • Convert.ToInt ()
  • Int.TryParse ()

Se você estiver em dúvida sobre a input, que deve ser convertida, sempre vá para os methods TryParse, não importa se você tentar analisar strings, variável int ou não.

Update In C # 7.0 out variables ​​podem ser declaradas diretamente onde elas são passadas como um argumento, portanto, o código acima poderia ser condensado para isso:

 if(Int32.TryParse(input, out int number)) { /* Yes input could be parsed and we can now use number in this code block scope */ } else { /* No, input could not be parsed to an integer */ } 

Um exemplo completo ficaria assim:

 class Program { static void Main(string[] args) { Console.WriteLine("Hello World!"); var foo = Console.ReadLine(); if (int.TryParse(foo, out int number1)) { Console.WriteLine($"{number1} is a number"); } else { Console.WriteLine($"{foo} is not a number"); } Console.WriteLine($"The value of the variable {nameof(number1)} is {number1}"); Console.ReadLine(); } } 

Aqui você pode ver que a variável number1 é inicializada mesmo que a input não seja um número e tenha o valor 0 independente, então é válido mesmo fora do bloco declarando se

Você precisa typecast a input. tente usar o seguinte

 int input = Convert.ToInt32(Console.ReadLine()); 

Ele irá lançar exceção se o valor for não numérico.

Editar

Eu entendo que o acima é rápido. Eu gostaria de melhorar minha resposta:

 String input = Console.ReadLine(); int selectedOption; if(int.TryParse(input, out selectedOption)) { switch(selectedOption) { case 1: //your code here. break; case 2: //another one. break; //. and so on, default.. } } else { //print error indicating non-numeric input is unsupported or something more meaningful. } 

Eu usei int intTemp = Convert.ToInt32(Console.ReadLine()); e funcionou bem, aqui está o meu exemplo:

  int balance = 10000; int retrieve = 0; Console.Write("Hello, write the amount you want to retrieve: "); retrieve = Convert.ToInt32(Console.ReadLine()); 

Melhor maneira é usar o TryParse:

 Int32 _userInput; if(Int32.TryParse (Console.Readline(), out _userInput) {// do the stuff on userInput} 
 int op = 0; string in = string.Empty; do { Console.WriteLine("enter choice"); in = Console.ReadLine(); } while (!int.TryParse(in, out op)); 

Eu não vi uma resposta boa e completa à sua pergunta, então mostrarei um exemplo mais completo. Existem alguns methods postados mostrando como obter input de números inteiros do usuário, mas sempre que você faz isso você também precisa

  1. validar a input
  2. exibir uma mensagem de erro se for dada input inválida e
  3. percorra até que uma input válida seja fornecida.

Este exemplo mostra como obter um valor inteiro do usuário que seja igual ou maior que 1. Se uma input inválida for fornecida, ele detectará o erro, exibirá uma mensagem de erro e solicitará que o usuário tente novamente uma input correta.

 static void Main(string[] args) { int intUserInput = 0; bool validUserInput = false; while (validUserInput == false) { try { Console.Write("Please enter an integer value greater than or equal to 1: "); intUserInput = int.Parse(Console.ReadLine()); //try to parse the user input to an int variable } catch (Exception) { } //catch exception for invalid input. if (intUserInput >= 1) //check to see that the user entered int >= 1 { validUserInput = true; } else { Console.WriteLine("Invalid input. "); } }//end while Console.WriteLine("You entered " + intUserInput); Console.WriteLine("Press any key to exit "); Console.ReadKey(); }//end main 

Na sua pergunta parece que você queria usar isso para opções de menu. Então, se você quisesse obter uma input int para escolher uma opção de menu, você poderia alterar a instrução if para

 if ( (intUserInput >= 1) && (intUserInput < = 4) ) 

Isso funcionaria se você precisasse que o usuário escolhesse uma opção de 1, 2, 3 ou 4.

 static void Main(string[] args) { Console.WriteLine("Please enter a number from 1 to 10"); int counter = Convert.ToInt32(Console.ReadLine()); //Here is your variable Console.WriteLine("The numbers start from"); do { counter++; Console.Write(counter + ", "); } while (counter < 100); Console.ReadKey(); } 

Você poderia simplesmente ir em frente e tentar:

  Console.WriteLine("1. Add account."); Console.WriteLine("Enter choice: "); int choice=int.Parse(Console.ReadLine()); 

Isso deve funcionar para a declaração do caso.

Ele funciona com a instrução switch e não lança uma exceção.