Как предотвратить определенные формы ввода при написании методов?

Я все еще новичок в программировании на языках программирования высокого уровня, поэтому я не знаю, является ли это простым решением, но я рад учиться в любом случае. Я запрограммировал небольшую программу сигнализации на C#, которая позволяет пользователю вводить через сколько секунд сигнал тревоги должен погаснуть. Он работает отлично, но вход, который пользователь должен дать, должен быть числом. Когда пользователь вводит любую форму текста, программа аварийно завершает работу. Теперь, как я могу предотвратить ввод текста пользователями и вызвать функцию или сделать что-то еще, когда пользователь делает, а не просто сбой программы?

Это код у меня есть сейчас:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Test
{
    class Alarm
    {
        public static void play()
        {
            int sec;
            sec = Convert.ToInt16(Console.ReadLine());

            for (int i = 0; i < seconds; ++i)
            {
                System.Threading.Thread.Sleep(1000);
            }

            for (int i = 0; i < 10; i++)
            {
                Console.Beep();
            }
        }
    }
}

8 ответов


вы должны завершить проверку до преобразования:

int sec;

if (int.TryParse(Console.ReadLine(), out sec)
{
  // this is valid continue
}
else
{
  // show error highlighting that entry must be a number
}

int.TryParse вернет логическое выделение, является ли вход анализируемым для int. Он также установит ваш sec переменной значение в случае успеха.


вы можете бесконечно петлять, пока пользователь не введет число:

int number = 0;
while(!Int32.TryParse(Console.ReadLine(), out number))
{
    Console.WriteLine("Please input a number.");
}

Int32.TryParse возвращает false Если преобразование не удалось, вместо того, чтобы бросать исключение и в случае успеха возвращает результат во втором


здесь уже ответили люди. Я люблю делать это как extension method Так что я могу назвать это во многих местах.

public static bool IsNumeric(this string theValue)
{
  long retNum;
  return long.TryParse(theValue, System.Globalization.NumberStyles.Integer, 
            System.Globalization.NumberFormatInfo.InvariantInfo, out retNum);
}

тогда я назову это так

if(Console.ReadLine().IsNumeric())
{
    //The value is numeric. You can use it    
}

вы должны использовать метод анализа try.

что-то вроде этого:

  int number;
  bool result = Int32.TryParse(Console.ReadLine(), out number);

Если result true, то он успешно проанализировал его, что означает, что это целое число. Если нет, это не удалось, что означает, что это не целое число.

затем вы можете использовать number в качестве значения, которое было проанализировано как int32.


заменить

sec = Convert.ToInt16(Console.ReadLine());

С

try {
    sec = Convert.ToInt16(Console.ReadLine());
}

catch(Exception e ){
    Console.Writeline(" Enter numbers only");
}

то, что вы пытаетесь сделать, часто называется Вход Проверки. В вашем случае вам нужно проверить, что они ввели номер перед его разбором. Типа INT16 имеет метод tryparse функция, которая поможет вам.


добавление отдельной функции, которая использует оператор try, чтобы поймать ошибку, которая возникает при попытке скрыть недопустимую строку в целое число.

int readInput()
{
    int sec;
    while(true)
    {
        try
        {
            sec = Convert.ToInt16(Console.ReadLine());
            return sec;
        }
        catch(Exception e) 
                    { 
                            Console.WriteLine("Enter an integer!");
                    }
    }
    return 0;
}

Если вы хотите сделать что-то более элегантное, чем отображать сообщение об ошибке и просить пользователя повторно ввести данные, вы можете попробовать обработать каждое нажатие клавиши, как это происходит с