0

我正在构建一个应用程序,它接受用户的两个输入。一个int,另一个float。 int.MaxValue并且float.MaxValue是我用来验证输入的两个属性。

但是,输入是通过添加每个来构建的,KeyChar因为每个键输入都必须在按键事件期间进行验证,因为应用程序将用户限制为数字(整数/小数)。

到目前为止的代码:

ConsoleKeyInfo key;
const int intMaxValue = int.MaxValue;
const float floatMaxValue = float.MaxValue;
bool validated;
int tempAmount;
int intAmount;
string tempVal="";

do{
    key = Console.ReadKey (true);
    if (key.Key != ConsoleKey.Backspace)
    {                    
       validated  = int.TryParse (key.KeyChar.ToString(), out tempAmount);
       if (validated)
       {
          ///Full amount is built here
          tempVal += key.KeyChar;
  //Fails here--->> as Type Cast happens on a String which hold a value beyond an int
          if (int.Parse(tempVal) < intMaxValue)
          {                    
             intAmount = int.Parse(tempVal);
             Console.Write(key.KeyChar);                         
          }

我可以在用户按下 Enter 键后进行此测试。但是,它仍然会失败。因为 int 不可能超过它的最大值..

因此我想出了以下内容:但是感觉效率不高,因为我的第二个输入验证是基于float...。

if (float.Parse(tempVal) < intMaxValue)
{

因此,请有人向我展示可在两种情况下使用的 int、float 类的有效属性。 任何其他方式来缝合输入,同时逐位验证每个键,直到用户输入 Enter 键。

4

3 回答 3

1

您可以尝试使用TryParse. TryParse如果该值无效,则评估为 false Int32(如果超过 ,则为 false Int32.MaxValue)。

int realValue;

if (Int32.TryParse(tempVal, out realValue))
   {                    
      intAmount = int.Parse(tempVal);
      Console.Write(key.KeyChar);                         
   }

您还可以使用相应float.TryParse的来测试您期望的浮点值。

于 2013-09-22T10:10:45.710 回答
1

你可以试试这个:

if (validated)
   {
      ///Full amount is built here 
      long l = long.Parse(tempVal + key.KeyChar);        
      if (l < intMaxValue)
      {                    
         intAmount = (int)l;
         tempVal += key.KeyChar;
         Console.Write(key.KeyChar);                         
      }

但是,正如其他人所建议的那样,您应该与循环结合使用Console.ReadLine和使用,直到输入为.TryParsewhilevalidated

在对您的代码进行更深入的扫描后,我认为您不需要tempVal当您已经拥有时intAmount,只需执行以下操作:

 if (validated)
   {
      long k = intAmount*10L + (int) key.KeyChar - 48;
      if (k < intMaxValue)
      {                    
         intAmount = (int)k;
         Console.Write(key.KeyChar);                         
      }         
于 2013-09-22T10:24:33.500 回答
0

使用 ReadLine 会更容易

bool validated = false;
int integerRequired;
Console.WriteLine("Type an integer number:");
while(validated == false)
{    
    string userInput = Console.ReadLine();
    validated  = int.TryParse (userInput, out integerRequired);
    if (!validated )
        Console.WriteLine("Not a valid integer, please retype a valid integer number");
}

float singleRequired;
validated = false;
Console.WriteLine("Type a floating point number:");
while(validated == false)
{    
    string userInput = Console.ReadLine();
    validated  = Single.TryParse (userInput, out singleRequired);
    if (!validated)
        Console.WriteLine("Not a valid float, please retype a valid float number");
}

在此示例中,您仅在用户完成键入并按 Enter 时才对用户输入做出反应。此时,您可以使用适合输入的 TryParse 版本评估输入,并选择是否向用户显示错误消息。

于 2013-09-22T10:20:49.263 回答