C# Как можно проверить формат пользовательского ввода?


#1

Решаю задачу, в ней нужно считать математическое выражение введённое пользователем (например 2+2, 15*10...) и посчитать его. меня интересует как это сделать лучше всего, а то предполагаю, что запускать цикл проверки каждого элемента полученной строки и от их значений принимать какие-то действия не является лучшим вариантом...


#2
    static void Main(string[] args)
    {
        Console.WriteLine("введите выражение. например 8+2");
        string[] tmp = new string[1];
        tmp[0] = Console.ReadLine();

        char operation = ' '; // будет хранить символ операции 
        int signPos = tmp[0].IndexOf('/');
        // IndexOf - ищет первое вхождение указаного символа (возвращает его позицию),
        // если символа в строке нету - возвращает -1
        if (signPos == -1)
        {
            signPos = tmp[0].IndexOf('*');
            if (signPos == -1)
            {
                signPos = tmp[0].IndexOf('+');
                if (signPos == -1)
                {
                    signPos = tmp[0].IndexOf('-');
                }
            }
        }

        // если условие будет истинным, то в пользовательском вводе присутствует знак
        if (signPos != -1)
        {
            operation = tmp[0][signPos];
            // разбиваем строку на подстроки (таким образом получаем массив строк содержащие в себе нужные операнды)
            tmp = tmp[0].Split(operation);

            int[] operands = new int[2]; // будет хранить в себе значения операндов

            try
            {
                for (int i = 0; i < operands.Length; i++)
                {
                    operands[i] = Convert.ToInt32(tmp[i]);
                }
            }
            catch (FormatException ex)
            {
                Console.WriteLine("Ошибка в вводе!!!");
                Console.WriteLine(ex.Message);
            }

            Console.WriteLine();
            switch (operation)
            {
                case '/':
                    {
                        if (operands[1] != 0) 
                        {
                            Console.WriteLine(operands[0] / operands[1])  ;
                        }
                        else
                        {
                            Console.WriteLine("Ошибка в вводе!!! Делитель равен 0");
                        }
                        break;
                    }
                case '*':
                    {
                        Console.WriteLine(operands[0] * operands[1])  ;
                        break;
                    }
                case '-':
                    {
                        Console.WriteLine(operands[0] - operands[1])  ;
                        break;
                    }
                case '+':
                    {
                        Console.WriteLine(operands[0] + operands[1])  ;
                        break;
                    }
            }
        }
        else
        {
            Console.WriteLine("Неправильный ввод!!!");
        }

        Console.ReadKey();
    }

#3

Либо же эту задачу можно реализовать используя регулярные выражения:

static void Main(string[] args)
{
    string userInput = Console.ReadLine();

    //Console.WriteLine(Regex.IsMatch(userInput, @"^\d+[+|-|*|\\]\d+$"));

    if (Regex.IsMatch(userInput, @"^\d+[+|-|*|\\]\d+$"))
    {
        int a = Convert.ToInt32(Regex.Match(userInput, @"^\d+").Value);
        int b = Convert.ToInt32(Regex.Match(userInput, @"\d+$").Value);
        switch (Regex.Match(userInput, @"[+|-|*|\\]").Value)
        {
            case "-":
                Console.WriteLine($"{a} - {b} = {a - b}");
                break;
            case "+":
                Console.WriteLine($"{a} + {b} = {a + b}");
                break;
            case "*":
                Console.WriteLine($"{a} * {b} = {a * b}");
                break;
            case "/":
                Console.WriteLine($"{a} / {b} = {a / b}");
                break;
        }
    }
    else
    {
        Console.WriteLine("UncorrectInput");
    }

    Console.ReadKey();
}

#4

спасибо всем!