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