Как проверить ввод пользователя, чтобы разрешить только числа

У меня есть метод, который позволяет пользователю вводить любое число, кроме 999. Но я не знаю, как создать проверку, когда пользователь вводит отрицательное число или букву.

    static int EnterScores(double[] scores, int maxScores)
    {
        double userInput;           
        int count = 0;
        while (count < maxScores)
        {
            Console.Write("Enter a score(or 999 to quit): ");
            userInput = double.Parse(Console.ReadLine());
            if (userInput == 999 || userInput < 0)
                break;
            scores[count++] = userInput;       
        }
        return count;
    }

У вас уже есть чек с userInput < 0. В чем проблема?

Progman 09.04.2019 22:19

Извините, я должен был сказать, что создаю сообщение об ошибке всякий раз, когда пользователь вводит отрицательное число или букву.

SH093 09.04.2019 22:22

Когда maxScores больше, чем длина массива, вы получите исключение индекса вне диапазона. Также кажется произвольным, что пользователь может ввести 1000 или больше, но 999 завершает его.

sticky bit 09.04.2019 22:31

см. stackoverflow.com/questions/7607260/…, как проверять нечисловые символы. Если у вас есть строка без нечисловых символов, вы можете проверить <999.

Frank Ball 09.04.2019 22:55
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
139
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете использовать двойной .TryParse. Если он может преобразовать строку в число с плавающей запятой - это будет true

...
var str = Console.ReadLine();
if (double.TryParse(str, out userInput)){
    if (userInput == 999 || userInput < 0)
        break;
    scores[count++] = userInput;
}
...

Я пробовал это раньше. Проблема в том, что Console.Write("Введите счет(или 999 для выхода): "); приходится постоянно читать. С кодом, который вы связали, мне нужно нажать Enter для ввода.

SH093 09.04.2019 22:32

@SH093 попробуйте добавить else к этому if. Нравится if (double.TryParse(...)) { ... } else { break; }

Aleks Andreev 09.04.2019 22:39

хорошо, это устраняет первую проблему. Моя основная проблема по-прежнему дает мне ошибку всякий раз, когда я ввожу букву.

SH093 09.04.2019 22:46

Разделите тесты для userInput == 999 и userInput < 0, например:

...
if (userInput == 999)
{
    break;
}
else if (userInput < 0)
{
    Console.WriteLine("Invalid input");
} 
else
{
    scores[count++] = userInput;
}
...

Это работает, но как насчет проверки письма?

SH093 09.04.2019 22:35

В этом случае используйте double.TryParse, как предложил @vic_78 в его ответе. Если результат равен false, это означает, что введенное значение не может быть преобразовано в двойное, и в этом случае вы можете отобразить сообщение об ошибке «неверный ввод».

RWRkeSBZ 09.04.2019 22:39
Ответ принят как подходящий

Если пользователь вводит букву или что-то, что не может быть преобразовано в double, ваш этот фрагмент кода double.TryParse выдаст exception и программа завершится ошибкой.

Поэтому вы должны использовать блок try-catch здесь:


try
{
    userInput = double.Parse(Console.ReadLine());
    if (userInput == 999)
    {
        break;
    }
    else if (userInput < 0)
    {
        Console.WriteLine("Invalid input");
    } 
    else
    {
        scores[count++] = userInput;
    }
}
catch(Exception e)  // will take care of letters
{
    Console.WriteLine("You enter an Invalid input !"):
}

В операторе catch, как «Exception e» заботится о буквах?

SH093 09.04.2019 22:49

Просто введите этот код и введите букву, и вы увидите, как это позаботится о письмах.

Zain Arshad 09.04.2019 22:50

e на самом деле не требуется, так как вы его не используете. Просто catch (Exception) { } работает.

Blorgbeard 12.04.2019 01:37

@Blorgbeard требуется ... иначе выдаст ошибку <identifier> expected.

Zain Arshad 12.04.2019 04:57

На самом деле вам даже не нужен Exception, вы можете просто сделать catch { }, чтобы перехватить все исключения.

Blorgbeard 12.04.2019 05:20

да, это можно сделать, но говорить, что вам не нужно добавлять имя object, как e, неправильно. Но это приемлемо, я думаю, однако я попробую это на своей машине.

Zain Arshad 12.04.2019 05:22

Это особый случай для блоков catch.

Blorgbeard 12.04.2019 16:40

Другие вопросы по теме