我如何只允许将数字输入到我的C#控制台应用程序中?

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

您好,我希望禁用键盘按钮,AZ,括号,问号等。 我想要它,所以如果你输入它,它将不会出现在控制台中。 我只希望数字1-9出现。 这是在C#Console应用程序中。 谢谢您的帮助!

试试这段代码

 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#,这可能有点过头了,因为它使用了该语言的一些更高级的方面。 无论如何,我希望你觉得它很有趣。

它有一些不错的function:

  • ReadKeys方法采用任意函数来测试到目前为止字符串是否有效。 这样,只要您想要从键盘输入过滤输入(例如字母或数字但没有标点符号),就可以轻松重复使用。

  • 它应该处理你抛出的任何可以解释为double的东西,例如“-123.4E77”。

然而,与John Woo的答案不同,它不处理退格。

这是代码:

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

您还可以实现一个返回false而不是抛出exception的IsStringOrDouble函数,但我将其作为练习。

另一种可以扩展的方法是让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; } }