web-dev-qa-db-fra.com

Lecture d'un entier à partir d'une entrée utilisateur

Ce que je cherche, c'est comment lire un entier qui a été donné par l'utilisateur à partir de la ligne de commande (projet de console). Je connais principalement le C++ et ai commencé par le chemin C #. Je sais que Console.ReadLine (); prend seulement un caractère/une chaîne. Donc, en bref, je cherche la version entière de cela. 

Juste pour vous donner une idée de ce que je fais exactement:

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

Je cherche cela depuis longtemps. J'ai trouvé beaucoup sur C mais pas C #. J'ai cependant trouvé un fil, sur un autre site, qui suggérait de convertir char en int. Je suis sûr qu'il doit y avoir un moyen plus direct que la conversion. 

55
TomG

Vous pouvez convertir la chaîne en entier à l’aide de Convert.ToInt32 () function

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

Je vous suggère d'utiliser TryParse:

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

De cette façon, votre application ne lève pas d'exception si vous essayez d'analyser quelque chose comme "1q" ou "23e", parce que quelqu'un a fait une entrée erronée.

Int32.TryParse renvoie une valeur booléenne, vous pouvez donc l'utiliser dans une instruction if pour voir si vous devez ou non créer une branche de votre code:

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

A votre question: vous ne trouverez pas de solution pour lire un entier car ReadLine() lit toute la ligne de commande, threfor retourne une chaîne. Ce que vous pouvez faire, c’est essayer de convertir cette entrée en une variable int16/32/64.

Il existe plusieurs méthodes pour cela:

Si vous avez des doutes sur l'entrée à convertir, optez toujours pour les méthodes TryParse, peu importe si vous essayez d'analyser des chaînes, une variable int ou autre.

Update En C # 7.0, les variables out peuvent être déclarées directement là où elles sont passées en tant qu'argument, le code ci-dessus pourrait donc être condensé dans ceci:

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 exemple complet ressemblerait à ceci:

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();
    }
}

Vous pouvez voir ici que la variable number1 est initialisée même si l’entrée n’est pas un nombre et a la valeur 0 quelle qu’elle soit, elle est donc valide même en dehors du bloc de déclaration de if

41
Marco

Vous devez dactylographier l'entrée. essayez d'utiliser ce qui suit 

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

Il lève une exception si la valeur est non numérique.

Modifier

Je comprends que ce qui précède est rapide. Je voudrais améliorer ma réponse:

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.
}
8
Kajal Sinha
int op = 0;
string in = string.Empty;
do
{
    Console.WriteLine("enter choice");
    in = Console.ReadLine();
} while (!int.TryParse(in, out op));
3
font

J'ai utilisé int intTemp = Convert.ToInt32(Console.ReadLine()); et cela a bien fonctionné, voici mon exemple:

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

Je n'ai pas vu de réponse satisfaisante à votre question et je vais donc vous donner un exemple plus complet. Certaines méthodes publiées montrent comment obtenir une entrée d’entier de l’utilisateur, mais chaque fois que vous faites cela, vous devez aussi généralement: 

  1. valider la saisie 
  2. afficher un message d'erreur si une entrée non valideest donné, et 
  3. boucle jusqu'à ce qu'une entrée valide soit donnée.

Cet exemple montre comment obtenir de l'utilisateur un nombre entier égal ou supérieur à 1. Si une entrée non valide est fournie, l'erreur sera interceptée, un message d'erreur sera demandé et l'utilisateur sera invité à réessayer.

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

Dans votre question, il semble que vous souhaitiez utiliser ceci pour les options de menu. Donc, si vous voulez obtenir une entrée int pour choisir une option de menu, vous pouvez changer l’instruction if en

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

Cela fonctionnerait si vous deviez choisir une option de 1, 2, 3 ou 4.

2
technoman23

Mieux vaut utiliser TryParse:

Int32 _userInput;
if(Int32.TryParse (Console.Readline(), out _userInput) {// do the stuff on userInput}
2
Alexander Bell

Utilisez cette simple ligne:

int x = int.parse(console.readline());
1
Zohaib ur Rehman
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();

    }
0
kunleth