【问题标题】:How do I only allow number input into my C# Console Application?如何只允许在我的 C# 控制台应用程序中输入数字?
【发布时间】:2012-10-17 20:58:42
【问题描述】:
Console.WriteLine("Enter the cost of the item");                           
string input = Console.ReadLine();
double price = Convert.ToDouble(input);

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

【问题讨论】:

    标签: c# console-application


    【解决方案1】:

    过了一会儿,我得到了一个非常简短的解决方案:

    double number;
    Console.Write("Enter the cost of the item: ");
    while (!double.TryParse(Console.ReadLine(), out number))
    {
       Console.Write("This is not valid input. Please enter an integer value: ");
    }
    
    Console.Write("The item cost is: {0}", number);                          
    

    再见!

    【讨论】:

      【解决方案2】:

      此代码将允许您:

      • 只写一个点(因为数字只能有一个小数分隔符);
      • 开头加一个减号;
      • 开头是一个零。

      这意味着你不能写类似:“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);
          }
      }
      

      【讨论】:

        【解决方案3】:
                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;
                        }
                    }
        

        【讨论】:

        • 我希望禁用键盘按钮、A-Z、括号、问号等。我想要它,所以如果你输入它,它不会出现在控制台中。我只希望数字 1-9 显示出来。 这不会做这些事情。
        【解决方案4】:

        这是一种方法。如果您刚开始使用 C#,这可能有点矫枉过正,因为它使用了该语言的一些更高级的方面。无论如何,我希望你觉得它很有趣。

        它有一些不错的功能:

        • ReadKeys 方法采用任意函数来测试到目前为止的字符串是否有效。每当您想要从键盘过滤输入(例如字母或数字但没有标点符号)时,这使得重用变得容易。

        • 它应该处理你扔给它的任何可以被解释为双精度的东西,例如“-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<string> 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&lt;string&gt; 参数:一个用于确定子字符串是否表示有效条目的开始,另一个用于说明它是否完整。这样,我们可以允许按键做出贡献,但在输入完成之前不允许 Enter 键。这对于您想要确保一定强度的密码输入或“是”/“否”输入等情况很有用。

        【讨论】:

          【解决方案5】:

          试试这个代码sn-p

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

          【讨论】:

          • 我在网上修改了一些代码以满足您的需要。不管怎样,欢迎来到 stackOverFlow!
          • 我回头看了看,它帮助我解决了另一个问题。随着我对 C# 的了解越多,我就越了解您在做什么。在我理解这一切之前,我确实还有很长的路要走!
          • @491243 我测试了你流畅的代码 sn-p。为了使其按您的预期正常工作,它必须跟在末尾的Console.WriteLine();。起初我错过了这一点,花了我 1 个小时才弄清楚出了什么问题。不错的代码!
          • 您可以通过添加一些额外的 cmets 来改进此答案,以帮助解释您的代码如何以及为什么工作。我最终通过玩弄它来弄清楚它,但仍然......例如,Console.ReadKey(true);true 的布尔参数值对于防止显示其他键是必要的。
          【解决方案6】:

          This MSDN article 解释了如何在控制台窗口中一次读取一个字符。在使用Char.IsNumber() 方法输入每个字符时对其进行测试,并拒绝那些未通过测试的字符。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-01-25
            • 2014-02-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多