Как мне разрешить ввод номера в мое консольное приложение C #?
Console.WriteLine("Enter the cost of the item"); string input = Console.ReadLine(); double price = Convert.ToDouble(input);
Привет, я хочу, чтобы кнопки клавиатуры, AZ, скобки, вопросительный знак и т. Д. Были отключены. Я хочу, чтобы это было, если вы введете его, он не появится в консоли. Я только хочу, чтобы цифры 1-9 отображались. Это приложение C # Console. Спасибо за помощь!
- Отключение ввода в консоли C # до завершения определенной задачи
- Как открыть окно консоли
- Установка позиции курсора в консольном приложении Win32
- Как остановить автоматическое закрытие приложений C #?
- Как запустить консольное приложение .NET в фоновом режиме
- .NET Console TextWriter, который понимает Отступ / Неподвижный / IndentLevel
- Как запустить консольное приложение из Windows Service?
- Почему закрытие windows консоли сразу после отображения моего вывода?
попробуйте этот fragment кода
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();
В этой статье MSDN объясняется, как читать символы по одному в окне консоли. Проверяйте каждый символ, когда он вводится с помощью метода Char.IsNumber () , и отклоняйте те символы, которые не прошли тест.
Вот один из подходов. Вероятно, это слишком сложно, если вы только начинаете работать на C #, так как он использует некоторые более продвинутые аспекты языка. В любом случае, надеюсь, вы найдете это интересным.
У этого есть некоторые интересные особенности:
-
Метод
ReadKeys
принимает произвольную функцию для проверки того, действительна ли строка. Это упрощает повторное использование всякий раз, когда вы хотите отфильтровать ввод с клавиатуры (например, буквы или цифры, но без пунктуации). -
Он должен обрабатывать все, что вы бросаете на него, что можно интерпретировать как двойное, например «-123.4E77».
Однако, в отличие от ответа Джона Ву, он не справляется с обратными windowsми.
Вот код:
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; } } } }
Вы также можете реализовать функцию IsStringOrDouble
которая возвращает false
вместо исключения исключения, но я оставляю это как упражнение.
Другим способом, который это может быть расширен, было бы для ReadKeys
взять два параметра Predicate
: один, чтобы определить, представляла ли подстрока начало действительной записи, а вторая – для того, чтобы сказать, была ли она завершена. Таким образом, мы можем позволить нажатиям клавиш внести свой вклад, но запретить клавишу Enter до тех пор, пока запись не будет завершена. Это было бы полезно для таких вещей, как ввод пароля, где вы хотите обеспечить определенную силу, или для записи «да» / «нет».
Этот код позволит вам:
- Напишите только одну точку (потому что числа могут иметь только один разделитель на десятичную дробь);
- Один минус в начале;
- Один ноль в начале.
Это означает, что вы не сможете написать что-то вроде: «00000.5» или «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; } }