Leer un número entero a partir de la entrada del usuario
Lo que estoy buscando es cómo leer un número entero proporcionado por el usuario desde la línea de comando (proyecto de consola). Principalmente conozco C++ y he comenzado a recorrer el camino de C#. Sé que Console.ReadLine(); solo toma un carácter/cadena. En resumen, estoy buscando la versión entera de esto.
Sólo 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 esto durante bastante tiempo. 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 forma más directa que la conversión.
Puede convertir la cadena a un número entero usando la función Convert.ToInt32()
int intTemp = Convert.ToInt32(Console.ReadLine());
Te sugiero 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 manera, su aplicación no genera una excepción si intenta analizar algo como "1q" o "23e", porque alguien realizó una entrada incorrecta.
Int32.TryParse
devuelve un valor booleano, por lo que puede usarlo en una if
declaración, para ver si necesita o no realizar 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 y, por lo tanto, devuelve una cadena. Lo que puedes hacer es intentar convertir esta entrada en una variable int16/32/64.
Hay varios métodos para esto:
- Análisis int()
- Convertir.ToInt()
- Int.TryParse()
Si tiene dudas sobre la entrada que se va a convertir, opte siempre por los métodos TryParse, sin importar si intenta analizar cadenas, variables int o cualquier otra cosa.
Actualización En C# 7.0, las variables se pueden declarar directamente donde se pasan como argumento, por lo que el código anterior se podría condensar 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álida incluso fuera del bloque if de declaración.
Necesitas encasillar la entrada. intenta usar lo 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.
}
int op = 0;
string in = string.Empty;
do
{
Console.WriteLine("enter choice");
in = Console.ReadLine();
} while (!int.TryParse(in, out op));