c# - org - Lectura de un número entero de la entrada del usuario
mapwindows 5 (9)
Lo que estoy buscando es cómo leer un entero que fue dado por el usuario desde la línea de comando (proyecto de la consola). Principalmente conozco C ++ y comencé a recorrer la ruta C #. Sé que Console.ReadLine (); solo toma un char / string. En resumen, estoy buscando la versión entera de esto.
Solo para darte una idea de lo que estoy haciendo exactamente:
Console.WriteLine("1. Add account.");
Console.WriteLine("Enter choice: ");
Console.ReadLine(); // Needs to take in int rather than string or char.
He estado buscando bastante tiempo para esto. He encontrado mucho en C pero no en C #. Sin embargo, encontré un hilo, en otro sitio, que sugería convertir de char a int. Estoy seguro de que tiene que haber una manera más directa que la conversión.
Mejor forma es usar TryParse:
Int32 _userInput;
if(Int32.TryParse (Console.Readline(), out _userInput) {// do the stuff on userInput}
Necesita encasillar la entrada. intente usar el siguiente
int input = Convert.ToInt32(Console.ReadLine());
Lanzará una excepción si el valor no es numérico.
Editar
Entiendo que lo anterior es rápido. Me gustaría mejorar mi respuesta:
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.
}
No vi una respuesta buena y completa a tu pregunta, así que mostraré un ejemplo más completo. Hay algunos métodos publicados que muestran cómo obtener la entrada de datos enteros del usuario, pero cada vez que hace esto, generalmente también necesita
- validar la entrada
- mostrar un mensaje de error si se da una entrada no válida, y
- continuar hasta que se da una entrada válida.
Este ejemplo muestra cómo obtener un valor entero del usuario que sea igual o mayor que 1. Si se proporciona una entrada no válida, detectará el error, mostrará un mensaje de error y le pedirá al usuario que intente nuevamente para obtener una entrada correcta.
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
En su pregunta, parece que quería usar esto para las opciones del menú. Entonces, si quisiera obtener una entrada int para elegir una opción de menú, podría cambiar la declaración if para
if ( (intUserInput >= 1) && (intUserInput <= 4) )
Esto funcionaría si necesitaras que el usuario escogiera una opción de 1, 2, 3 o 4.
Podrías seguir y probar:
Console.WriteLine("1. Add account.");
Console.WriteLine("Enter choice: ");
int choice=int.Parse(Console.ReadLine());
Eso debería funcionar para la declaración del caso.
Funciona con la instrucción switch y no arroja una excepción.
Puede convertir la cadena en un entero utilizando la función Convert.ToInt32()
int intTemp = Convert.ToInt32(Console.ReadLine());
Sugeriría que uses TryParse
:
Console.WriteLine("1. Add account.");
Console.WriteLine("Enter choice: ");
string input = Console.ReadLine();
int number;
Int32.TryParse(input, out number);
De esta forma, su aplicación no lanza una excepción, si intenta analizar algo como "1q" o "23e", porque alguien hizo una entrada defectuosa.
Int32.TryParse
devuelve un valor booleano, por lo que puede usarlo en una instrucción if
para ver si necesita o no una bifurcación de su código:
int number;
if(!Int32.TryParse(input, out number))
{
//no, not able to parse, repeat, throw exception, use fallback value?
}
A su pregunta: No encontrará una solución para leer un número entero porque ReadLine()
lee toda la línea de comando, threfor devuelve una cadena. Lo que puede hacer es intentar convertir esta entrada en la variable int16 / 32/64.
Hay varios métodos para esto:
Si tiene dudas sobre la entrada que se va a convertir, siempre use los métodos TryParse, sin importar si intenta analizar las cadenas, la variable int o lo que no.
Actualización En C # 7.0, las variables out pueden declararse directamente donde se pasan como un argumento, por lo que el código anterior podría condensarse en esto:
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 */
}
Un ejemplo completo se vería así:
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();
}
}
Aquí puede ver que la variable number1
se inicializa incluso si la entrada no es un número y tiene el valor 0 independientemente, por lo que es válido incluso fuera del bloque declarando si
int intTemp = Convert.ToInt32(Console.ReadLine());
y funcionó bien, aquí está mi ejemplo:
int balance = 10000;
int retrieve = 0;
Console.Write("Hello, write the amount you want to retrieve: ");
retrieve = Convert.ToInt32(Console.ReadLine());
int op = 0;
string in = string.Empty;
do
{
Console.WriteLine("enter choice");
in = Console.ReadLine();
} while (!int.TryParse(in, out op));
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();
}