Come faccio a consentire l’immissione del numero solo nella mia applicazione console C #?

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

Ciao, voglio che i pulsanti della tastiera, AZ, parentesi, punto interrogativo, ecc. Siano disabilitati. Lo voglio così se lo digiti, non verrà visualizzato nella Console. Voglio solo mostrare i numeri 1-9. Questo è nell’applicazione console C #. Grazie per l’aiuto!

prova questo snippet di codice

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

Questo articolo MSDN spiega come leggere i caratteri uno alla volta in una finestra della console. Testare ciascun carattere quando viene immesso con il metodo Char.IsNumber () e rifiutare quei caratteri che non superano il test.

Ecco un approccio. Probabilmente è eccessivo se stai iniziando solo in C #, poiché utilizza alcuni aspetti più avanzati della lingua. In ogni caso, spero che tu lo trovi interessante.

Ha alcune caratteristiche interessanti:

  • Il metodo ReadKeys accetta una funzione arbitraria per verificare se la stringa finora è valida. Ciò rende più facile il riutilizzo ogni volta che si desidera un input filtrato dalla tastiera (ad es. Lettere o numeri ma nessuna punteggiatura).

  • Dovrebbe gestire tutto ciò che viene lanciato che può essere interpretato come un doppio, ad esempio “-123.4E77”.

Tuttavia, a differenza della risposta di John Woo, non gestisce i backspaces.

Ecco il codice:

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

È anche ansible implementare una funzione IsStringOrDouble che restituisce false invece di IsStringOrDouble un’eccezione, ma lo lascio come esercizio.

Un altro modo in cui questo potrebbe essere esteso sarebbe che ReadKeys prendesse due parametri Predicate : uno per determinare se la sottostringa rappresentava l’inizio di una voce valida e una la seconda per dire se era completa. In questo modo potremmo consentire la pressione dei tasti, ma non consentire il tasto Invio fino al completamento della registrazione. Ciò sarebbe utile per cose come l’immissione della password in cui si desidera garantire un certo livello di forza, o per la voce “sì” / “no”.

Questo codice ti consentirà di:

  • Scrivi solo un punto (perché i numeri possono avere solo un separatore decimale);
  • Uno meno all’inizio;
  • Uno zero all’inizio.

Significa che non si è in grado di scrivere qualcosa del tipo: “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; } }