Leer un número entero a partir de la entrada del usuario

Resuelto TomG asked hace 10 años • 15 respuestas

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.

TomG avatar Jun 27 '14 11:06 TomG
Aceptado

Puede convertir la cadena a un número entero usando la función Convert.ToInt32()

int intTemp = Convert.ToInt32(Console.ReadLine());
CodingDefined avatar Jun 27 '2014 04:06 CodingDefined

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.TryParsedevuelve un valor booleano, por lo que puede usarlo en una ifdeclaració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 number1se 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.

Marco avatar Jun 27 '2014 04:06 Marco

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.
}
Kajal Sinha avatar Jun 27 '2014 04:06 Kajal Sinha
int op = 0;
string in = string.Empty;
do
{
    Console.WriteLine("enter choice");
    in = Console.ReadLine();
} while (!int.TryParse(in, out op));
font avatar Apr 08 '2015 23:04 font