Comment autoriser uniquement la saisie de numéros dans mon application console C #?

Console.WriteLine("Enter the cost of the item"); ssortingng input = Console.ReadLine(); double price = Convert.ToDouble(input); 

Bonjour, je veux désactiver les boutons du clavier, AZ, les crochets, le point d’interrogation, etc. Je le veux, donc si vous le tapez, il ne s’affichera pas dans la console. Je veux seulement que les chiffres 1-9 apparaissent. Ceci est dans l’application console C #. Merci pour l’aide!

essayez cet extrait de code

 ssortingng _val = ""; Console.Write("Enter your value: "); ConsoleKeyInfo key; do { key = Console.ReadKey(true); if (key.Key != ConsoleKey.Backspace) { double val = 0; bool _x = double.TryParse(key.KeyChar.ToSsortingng(), out val); if (_x) { _val += key.KeyChar; Console.Write(key.KeyChar); } } else { if (key.Key == ConsoleKey.Backspace && _val.Length > 0) { _val = _val.Subssortingng(0, (_val.Length - 1)); Console.Write("\b \b"); } } } // Stops Receving Keys Once Enter is Pressed while (key.Key != ConsoleKey.Enter); Console.WriteLine(); Console.WriteLine("The Value You entered is : " + _val); Console.ReadKey(); 

Cet article MSDN explique comment lire des caractères un par un dans une fenêtre de console. Testez chaque caractère tel qu’il est entré avec la méthode Char.IsNumber () et rejetez les caractères qui échouent au test.

Voici une approche. C’est probablement trop cher si vous débutez en C #, car il utilise des aspects plus avancés du langage. En tout cas, j’espère que vous le trouvez intéressant.

Il a quelques fonctionnalités intéressantes:

  • La méthode ReadKeys utilise une fonction arbitraire pour tester si la chaîne est jusqu’à présent valide. Cela facilite la réutilisation chaque fois que vous souhaitez filtrer une entrée du clavier (par exemple, des lettres ou des chiffres, mais pas de ponctuation).

  • Il doit gérer tout ce que vous lui lancez qui peut être interprété comme un double, par exemple “-123.4E77”.

Cependant, contrairement à la réponse de John Woo, il ne gère pas les espaces de retour.

Voici le code:

 using System; public static class ConsoleExtensions { public static void Main() { ssortingng entry = ConsoleExtensions.ReadKeys( s => { SsortingngToDouble(s) /* might throw */; return true; }); double result = SsortingngToDouble(entry); Console.WriteLine(); Console.WriteLine("Result was {0}", result); } public static double SsortingngToDouble(ssortingng s) { try { return double.Parse(s); } catch (FormatException) { // handle trailing E and +/- signs return double.Parse(s + '0'); } // anything else will be thrown as an exception } public static ssortingng ReadKeys(Predicate check) { ssortingng valid = ssortingng.Empty; while (true) { ConsoleKeyInfo key = Console.ReadKey(true); if (key.Key == ConsoleKey.Enter) { return valid; } bool isValid = false; char keyChar = key.KeyChar; ssortingng candidate = valid + keyChar; try { isValid = check(candidate); } catch (Exception) { // if this raises any sort of exception then the key wasn't valid // one of the rare cases when catching Exception is reasonable // (since we really don't care what type it was) } if (isValid) { Console.Write(keyChar); valid = candidate; } } } } 

Vous pouvez également implémenter une fonction IsSsortingngOrDouble qui retourne false au lieu de lancer une exception, mais je laisse cela comme un exercice.

Cela pourrait également être étendu si ReadKeys deux parameters Predicate : un pour déterminer si la sous-chaîne représente le début d’une entrée valide et un second pour indiquer si elle est complète. De cette façon, nous pourrions autoriser les appuis sur les touches, mais interdire la touche Entrée jusqu’à la fin de la saisie. Cela serait utile pour des choses telles que la saisie d’un mot de passe pour lequel vous voulez assurer une certaine force, ou pour une entrée “oui” / “non”.

Ce code vous permettra de:

  • Écrivez un seul point (car les nombres ne peuvent avoir qu’un seul séparateur décimal);
  • Un moins au début;
  • Un zéro au début.

Cela signifie que vous ne pouvez pas écrire quelque chose comme: “00000.5” ou “0000 …- 5”.

 class Program { static ssortingng backValue = ""; static double value; static ConsoleKeyInfo inputKey; static void Main(ssortingng[] args) { Console.Title = ""; Console.Write("Enter your value: "); do { inputKey = Console.ReadKey(true); if (char.IsDigit(inputKey.KeyChar)) { if (inputKey.KeyChar == '0') { if (!backValue.StartsWith("0") || backValue.Contains('.')) Write(); } else Write(); } if (inputKey.KeyChar == '-' && backValue.Length == 0 || inputKey.KeyChar == '.' && !backValue.Contains(inputKey.KeyChar) && backValue.Length > 0) Write(); if (inputKey.Key == ConsoleKey.Backspace && backValue.Length > 0) { backValue = backValue.Subssortingng(0, backValue.Length - 1); Console.Write("\b \b"); } } while (inputKey.Key != ConsoleKey.Enter); //Loop until Enter key not pressed if (double.TryParse(backValue, out value)) Console.Write("\n{0}^2 = {1}", value, Math.Pow(value, 2)); Console.ReadKey(); } static void Write() { backValue += inputKey.KeyChar; Console.Write(inputKey.KeyChar); } } 
  ssortingng input; double price; bool result = false; while ( result == false ) { Console.Write ("\n Enter the cost of the item : "); input = Console.ReadLine (); result = double.TryParse (input, out price); if ( result == false ) { Console.Write ("\n Please Enter Numbers Only."); } else { Console.Write ("\n cost of the item : {0} \n ", price); break; } }