web-dev-qa-db-fra.com

Comment valider l'entrée de la console en tant qu'entiers?

J'ai écrit mes codes et je veux le valider de telle sorte qu'il ne permette que la saisie d'entiers et non d'alphabets. Voici le code, s'il vous plaît, je vous aimerai pour m'aider. Merci.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace minimum
{
    class Program
    {
        static void Main(string[] args)
        {
            int a = Convert.ToInt32(Console.ReadLine());
            int b = Convert.ToInt32(Console.ReadLine());
            int c = Convert.ToInt32(Console.ReadLine());

            if (a < b)
            {
                if (a < c)
                {
                    Console.WriteLine(a + "is the minimum number");
                }
            }
            if (b < a)
            {
                if (b < c)
                {
                    Console.WriteLine(b + "is the minimum number");
                }
            }
            if (c < a)
            {
                if (c < b)
                {
                    Console.WriteLine(c + "is the minimum number");
                }
            }


            Console.ReadLine();
        }
    }
}
8
SIMI

Vous devriez vérifier s'il s'agit d'un int au lieu de le convertir immédiatement. Essayez quelque chose comme:

string line = Console.ReadLine();
int value;
if (int.TryParse(line, out value))
{
   // this is an int
   // do you minimum number check here
}
else
{
   // this is not an int
}
15
zov

Appelez simplement Readline () et faites une boucle avec Int.TryParse jusqu'à ce que l'utilisateur saisisse un nombre valide :)

int X;

String Result = Console.ReadLine();

while(!Int32.TryParse(Result, out X))
{
   Console.WriteLine("Not a valid number, try again.");

   Result = Console.ReadLine();
}

J'espère que cela pourra aider

9
Machinarius

Pour que la console filtre les frappes alphabétiques, vous devez vous charger de l'analyse syntaxique des entrées. La méthode Console.ReadKey () est fondamentale pour cela, elle vous permet de renifler la touche enfoncée. Voici un exemple d'implémentation:

    static string ReadNumber() {
        var buf = new StringBuilder();
        for (; ; ) {
            var key = Console.ReadKey(true);
            if (key.Key == ConsoleKey.Enter && buf.Length > 0) {
                return buf.ToString() ;
            }
            else if (key.Key == ConsoleKey.Backspace && buf.Length > 0) {
                buf.Remove(buf.Length-1, 1);
                Console.Write("\b \b");
            }
            else if ("0123456789.-".Contains(key.KeyChar)) {
                buf.Append(key.KeyChar);
                Console.Write(key.KeyChar);
            }
            else {
                Console.Beep();
            }
        }
    }

Vous pouvez ajouter, par exemple, Decimal.TryParse () dans l'instruction if () qui détecte la touche Entrée pour vérifier que la chaîne entrée est toujours un nombre valide. De cette façon, vous pouvez rejeter une entrée telle que "1-2".

8
Hans Passant
        string Temp;
        int tempInt,a;
        bool result=false;
        while ( result == false )
            {
            Console.Write ("\n Enter A Number : ");
            Temp = Console.ReadLine ();
            result = int.TryParse (Temp, out tempInt);
            if ( result == false )
                {
                Console.Write ("\n Please Enter Numbers Only.");
                }
            else
                {
                a=tempInt;
                break;
                }
            }
1
Sushrut Bhosale

Notez que

if (a < b) {
    if (a < c) {

est équivalent à

if (a < b && a < c) {

et que cette dernière forme introduit moins d'imbrication et est plus lisible, en particulier si votre code devient plus complexe. Aussi, vous devriez probablement jamais utiliser Convert.ToInt32 - il a un cas de coin particulièrement mal conçu et surprenant; et il est également moins sûr du type que int.Parse, qui est le meilleur choix possible - ou int.TryParse lorsque vous ne savez pas si la chaîne est valide. En gros, évitez Convert.... autant que possible.

1
Eamon Nerbonne

Ne convertissez pas l'entrée de l'utilisateur immédiatement. Mettez-le dans une chaîne et utilisez Int32.TryParse (...) pour savoir si un nombre a été entré ou non. Comme ça:

int i;
string input = Console.ReadLine();
if(Int32.TryParse(input, out i))
{
    // it is a number and it is stored in i
}
else
{
    // it is not a number
}
1
Erno de Weerd

Double/Float:

J'étends juste la réponse de @Hans Passant (en prenant soin de DecimalSeparator et "-"):

    static double ReadNumber()
    {
        var buf = new StringBuilder();
        for (; ; )
        {
            var key = Console.ReadKey(true);
            if (key.Key == ConsoleKey.Enter && buf.Length > 0)
            {
                Console.WriteLine();
                return Convert.ToDouble(buf.ToString());
            }
            else if (key.Key == ConsoleKey.Backspace && buf.Length > 0)
            {
                buf.Remove(buf.Length - 1, 1);
                Console.Write("\b \b");
            }
            else if (System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator.Contains(key.KeyChar) && buf.ToString().IndexOf(System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator) == -1)
            {
                buf.Append(key.KeyChar);
                Console.Write(key.KeyChar);
            }
            else if ("-".Contains(key.KeyChar) && buf.ToString().IndexOf("-") == -1 && buf.ToString() == "")
            {
                buf.Append(key.KeyChar);
                Console.Write(key.KeyChar);
            }
            else if ("0123456789".Contains(key.KeyChar))
            {
                buf.Append(key.KeyChar);
                Console.Write(key.KeyChar);
            }
            else
            {
                Console.Beep();
            }
        }
    }
0
user3550499

Ma solution préférée serait:

static void Main()
{
    Console.WriteLine(
        (
            from line in Generate(()=>Console.ReadLine()).Take(3)
            let val = ParseAsInt(line)
            where val.HasValue
            select val.Value
        ).Min()
    );
}
static IEnumerable<T> Generate<T>(Func<T> generator) { 
   while(true) yield return generator(); 
}
static int? ParseAsInt(string str) {
   int retval; 
   return int.TryParse(str,out retval) ? retval : default(int?); 
}

Bien sûr, en fonction de la spécification (un numéro non valide doit-il être répété?), Il peut être nécessaire de le modifier.

0
Eamon Nerbonne