Home > Software design >  c# input validation for strings and integers
c# input validation for strings and integers

Time:05-27

I am trying to validate string and integer input

For string input, I am trying to implement a validation that do not accept null or integers and this is what i have for now which doesn't have error handling for integers:

string name = Console.ReadLine().ToLower();

                if (name.Length == 0)
                {
                    Console.WriteLine("Name cannot be an empty field, try again!");
                    name = Console.ReadLine().ToLower();
                    return; }

and for the integer input, I would like to only accept integers and my problem is that these codes only allow me to enter a wrong input once before it shows me an error handing exception error

Console.Write("Enter exp: ");
                int exp = 0;
                try
                {
                    exp = int.Parse(Console.ReadLine());
                }
                catch
                {
                    Console.Write("Invalid exp, please enter a valid numerical value!: ");
                    exp = int.Parse(Console.ReadLine());
                }

How should I handle all these input errors or are there any improvements I can make to my codes that I have for now? All help is greatly appreciated !

CodePudding user response:

Use a while loop until the user enters an integer. And you should never use try...catch to check if an integer can be parsed. Always use int.TryParse(...). Everything else is a code smell (and slower in the case when it is not an integer).

var integerEntered = false;
int exp;
while (!integerEntered)
{
    Console.Write("Enter exp: ");
    var entered = Console.ReadLine();
    integerEntered = int.TryParse(entered, out exp);
    if (!integerEntered)
        Console.WriteLine("That was no valid integer. Please try again.");
}

CodePudding user response:

Console.Write("Enter exp: ");
    int exp;
    bool result = int.TryParse(Console.ReadLine(), out exp)
      if(result)
      {
       //you have an int value entered
      }
      else
      {
        Console.WriteLine("Please enter a valid number")
      }
      //code continues

CodePudding user response:

I suggest extracting methods, e.g.

For string values input

private static string ReadString(string title, 
                                 Func<string, string> errorMessage = null) {
  while (true) {
    if (!string.IsNullOrWhiteSpace(title))
      Console(title);

    string input = Console.ReadLine();

    string message = errorMessage == null 
      ? null
      : errorMessage(input);

    if (!string.IsNullOrWhiteSpace(message))
      return input;    

    Console.WriteLine(message);
  }
}

For integer values

private static string ReadInt(string title, Func<x, string> errorMessage = null) {
  while (true) {
    if (!string.IsNullOrWhiteSpace(title))
      Console(title);

    string input = Console.ReadLine();

    if (!int.TryParse(input, out int result)) {
      Console.WriteLine("Not valid integer value. Please, try again.");

      continue;
    }

    string message = errorMessage == null 
      ? null
      : errorMessage(result);

    if (!string.IsNullOrWhiteSpace(message))
      return input;    

    Console.WriteLine(message);
  }
}

Then you can use them

string name = ReadString("Please, enter name", 
  v => string.IsNullOrWhiteSpace(v) 
     ? "Name cannot be an empty field, try again!" 
     : "");

int exp = ReadInt("Enter exp: ", v => v < 0 ? "Exp must not be negative", "");

CodePudding user response:

    string str = Console.ReadLine();
    if(str.Length == 0 ) {
    Console.WriteLine(Please enter a number);
}
    if(str.All(!Char.IsDigit)) {
    Console.WriteLine("You can only enter numbers");  
}
  • Related