У меня есть метод, который позволяет пользователю вводить любое число, кроме 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;
}
Извините, я должен был сказать, что создаю сообщение об ошибке всякий раз, когда пользователь вводит отрицательное число или букву.
Когда maxScores
больше, чем длина массива, вы получите исключение индекса вне диапазона. Также кажется произвольным, что пользователь может ввести 1000
или больше, но 999
завершает его.
см. stackoverflow.com/questions/7607260/…, как проверять нечисловые символы. Если у вас есть строка без нечисловых символов, вы можете проверить <999.
Вы можете использовать двойной .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 попробуйте добавить else
к этому if
. Нравится if (double.TryParse(...)) { ... } else { break; }
хорошо, это устраняет первую проблему. Моя основная проблема по-прежнему дает мне ошибку всякий раз, когда я ввожу букву.
Разделите тесты для userInput
== 999 и userInput
< 0, например:
...
if (userInput == 999)
{
break;
}
else if (userInput < 0)
{
Console.WriteLine("Invalid input");
}
else
{
scores[count++] = userInput;
}
...
Это работает, но как насчет проверки письма?
В этом случае используйте double.TryParse
, как предложил @vic_78 в его ответе. Если результат равен false
, это означает, что введенное значение не может быть преобразовано в двойное, и в этом случае вы можете отобразить сообщение об ошибке «неверный ввод».
Если пользователь вводит букву или что-то, что не может быть преобразовано в 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» заботится о буквах?
Просто введите этот код и введите букву, и вы увидите, как это позаботится о письмах.
e
на самом деле не требуется, так как вы его не используете. Просто catch (Exception) { }
работает.
@Blorgbeard требуется ... иначе выдаст ошибку <identifier> expected
.
На самом деле вам даже не нужен Exception
, вы можете просто сделать catch { }
, чтобы перехватить все исключения.
да, это можно сделать, но говорить, что вам не нужно добавлять имя object
, как e
, неправильно. Но это приемлемо, я думаю, однако я попробую это на своей машине.
Это особый случай для блоков catch.
У вас уже есть чек с
userInput < 0
. В чем проблема?