¿Cómo solo acepto la entrada de números en mi aplicación de consola C #?

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

Hola, quiero que los botones del teclado, AZ, corchetes, signo de interrogación, etc. estén deshabilitados. Lo quiero así que si lo escribe, no aparecerá en la consola. Solo quiero que aparezcan los números del 1 al 9. Esto está en la aplicación de consola C #. ¡Gracias por la ayuda!

prueba este fragmento de código

 string _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.ToString(), out val); if (_x) { _val += key.KeyChar; Console.Write(key.KeyChar); } } else { if (key.Key == ConsoleKey.Backspace && _val.Length > 0) { _val = _val.Substring(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(); 

Este artículo de MSDN explica cómo leer caracteres uno a la vez en una ventana de consola. Pruebe cada carácter como se ingresa con el método Char.IsNumber () y rechace los caracteres que no pasaron la prueba.

Aquí hay un enfoque. Probablemente sea excesivo si recién comienza en C #, ya que usa algunos aspectos más avanzados del lenguaje. En cualquier caso, espero que lo encuentres interesante.

Tiene algunas características agradables:

  • El método ReadKeys toma una función arbitraria para probar si la cadena hasta ahora es válida. Esto hace que sea fácil de reutilizar cada vez que desee una entrada filtrada desde el teclado (por ejemplo, letras o números, pero sin signos de puntuación).

  • Debe manejar cualquier cosa que le arroje que pueda interpretarse como un doble, por ejemplo, “-123.4E77”.

Sin embargo, a diferencia de la respuesta de John Woo, no maneja los espacios intermedios.

Aquí está el código:

 using System; public static class ConsoleExtensions { public static void Main() { string entry = ConsoleExtensions.ReadKeys( s => { StringToDouble(s) /* might throw */; return true; }); double result = StringToDouble(entry); Console.WriteLine(); Console.WriteLine("Result was {0}", result); } public static double StringToDouble(string 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 string ReadKeys(Predicate check) { string valid = string.Empty; while (true) { ConsoleKeyInfo key = Console.ReadKey(true); if (key.Key == ConsoleKey.Enter) { return valid; } bool isValid = false; char keyChar = key.KeyChar; string 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; } } } } 

También podría implementar una función IsStringOrDouble que devuelve false lugar de lanzar una excepción, pero lo dejo como ejercicio.

Otra forma de extender esto sería que ReadKeys tomara dos parámetros Predicate : uno para determinar si la subcadena representaba el inicio de una entrada válida y la segunda para decir si estaba completa. De esa manera, podríamos permitir que las pulsaciones de tecla contribuyan, pero no permitir la tecla Intro hasta que se complete la entrada. Esto sería útil para cosas como la entrada de contraseña en la que desea garantizar una cierta fortaleza, o para la entrada “sí” / “no”.

Este código te permitirá:

  • Escriba solo un punto (porque los números pueden tener solo un separador decimal);
  • Un menos al principio;
  • Un cero al comienzo.

Significa que no podrá escribir algo como: “00000.5” o “0000 …- 5”.

 class Program { static string backValue = ""; static double value; static ConsoleKeyInfo inputKey; static void Main(string[] 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.Substring(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); } } 
  string 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; } }