2016-05-30 2 views
2

Это буквально моя первая программа, которую я когда-либо писал (начал изучать прошлый понедельник); Я новичок.Валидация ввода с плавающим/двойным типом в C#

Мой вопрос в том, как я могу предотвратить исключение исключений из-за того, что пользователь вводит недопустимый символ, когда программа запрашивает пользователя для входа fahreinheit или celsius (ожидающего числа) ??? Например, когда пользователь вводит «asfasd», программа выдает исключение.

Я сделал много поиска на сайте, прежде чем публиковать его, и я смог найти другие вопросы проверки ввода, однако все они касались C и C++, и поскольку я такой новичок, у меня есть жесткий с пониманием этих языков и тем, как они относятся к C#. Спасибо. Пожалуйста, смотрите код:

using System; 


namespace Converter 
{ 
class Program 
{ 
    static void Main() 
    { 
     float? FahrenheitInput = null; 
     double? CelsiusInput = null; 
     float? KilogramInput = null; 
     float? PoundsInput = null; 
     int UserChoice = 0; 
     do 
     { 

      Console.WriteLine("What would you like to convert? Enter the corresponding number.\n1. Fahrenheit to Celsius"); 
      Console.WriteLine("2. Celsius to Fahrenheit\n3. Pounds to Kilograms\n4. Kilograms to pounds\n5. Exit program"); 
      UserChoice = int.Parse(Console.ReadLine()); 
      switch (UserChoice) 
      { 
       case 1: 
        Console.WriteLine("Enter the temperature in Fahreinheit, number only:"); 
        FahrenheitInput = float.Parse(Console.ReadLine()); 
        Console.Clear(); 
        Console.WriteLine(FahrenheitInput + " degrees fahrenheit in Celsius is " + Program.FahrenheitToCelsius(FahrenheitInput) + "\n\n"); 
        break; 
       case 2: 
        Console.WriteLine("Enter the temperature in Celsius, number only:"); 
        CelsiusInput = double.Parse(Console.ReadLine()); 
        Console.Clear(); 
        Console.WriteLine(CelsiusInput + " degrees Celius in fahrenheit is " + Program.CelsiusToFahrenheit(CelsiusInput) + "\n\n"); 
        break; 
       case 5: 
        break; 
       default: 
        Console.WriteLine("This is not a valid entry. Please enter 1, 2, 3, 4, or 5."); 
        break; 

      } 
     } while (UserChoice != 5); 


    } 
    public static float? FahrenheitToCelsius(float? INPUT) 
    { 
     return (INPUT - 32) * 5/9; 
    } 
    public static double? CelsiusToFahrenheit(double? INPUT) 
    { 
     return INPUT * 1.8 + 32; 
    } 
} 

}

+0

вы ищете попытку catch https://msdn.microsoft.com/library/0yd65esw.aspx или регулярное выражение, но когда вы начинаете на этой неделе прочитал статью о попытке поймать – SeeuD1

ответ

4

Вы можете либо поместить его в блок Try-Catch, либо использовать цикл while для проверки ввода пользователя.

ниже - ваш код с циклом while, который проверяет ввод пользователей.

class Program 
{ 
    static void Main(string[] args) 
    { 
     double FahrenheitInput = 0; 
     double CelsiusInput = 0; 
     double KilogramInput = 0; 
     double PoundsInput = 0; 
     int UserChoice = 0; 
     do 
     { 

      Console.WriteLine("What would you like to convert? Enter the corresponding number.\n1. Fahrenheit to Celsius"); 
      Console.WriteLine("2. Celsius to Fahrenheit\n3. Pounds to Kilograms\n4. Kilograms to pounds\n5. Exit program"); 
      UserChoice = int.Parse(Console.ReadLine()); 
      switch (UserChoice) 
      { 
       case 1: 
        Console.WriteLine("Enter the temperature in Fahreinheit, number only:"); 
        while (!double.TryParse(Console.ReadLine(), out FahrenheitInput)) 
        { 
         Console.WriteLine("Invalid format, please input again!"); 
        }; 
        Console.Clear(); 
        Console.WriteLine(FahrenheitInput + " degrees fahrenheit in Celsius is " + Program.FahrenheitToCelsius(FahrenheitInput) + "\n\n"); 
        break; 
       case 2: 
        Console.WriteLine("Enter the temperature in Celsius, number only:"); 
        while (!double.TryParse(Console.ReadLine(), out CelsiusInput)) 
        { 
         Console.WriteLine("Invalid format, please input again!"); 
        }; 
        Console.Clear(); 
        Console.WriteLine(CelsiusInput + " degrees Celius in fahrenheit is " + Program.CelsiusToFahrenheit(CelsiusInput) + "\n\n"); 
        break; 
       case 5: 
        break; 
       default: 
        Console.WriteLine("This is not a valid entry. Please enter 1, 2, 3, 4, or 5."); 
        break; 

      } 
     } while (UserChoice != 5); 

    } 
    public static double FahrenheitToCelsius(double INPUT) 
    { 
     return (INPUT - 32) * 5/9; 
    } 
    public static double CelsiusToFahrenheit(double INPUT) 
    { 
     return INPUT * 1.8 + 32; 
    } 
} 
1

Использование int.TryParse вместо int.Parse и float.tryParse вместо float.Parse

4

TryParse ваш хороший друг здесь. В большинстве сценариев вы должны использовать TryParse, чем Parse. В вашем примере, вы можете сделать что-то вроде:

int validInt; 
int.TryParse(Console.ReadLine(), out validInt); 

float validFloat; 
float.TryParse(Console.ReadLine(), out validFloat); 

Parse vs. TryParse

2

Самый простой способ, имхо, чтобы изменить процедуру, чтобы переписать Parse в соответствующие TryParse:

// UserChoice = int.Parse(Console.ReadLine()); 
    UserChoice = int.TryParse(Console.ReadLine(), out UserChoice) ? UserChoice : -1; 

...

Немного сложнее (вам необходимо преобразовать float в float?)

// FahrenheitInput = float.Parse(Console.ReadLine()); 
    float v; 
    FahrenheitInput = float.TryParse(Console.ReadLine(), out v) ? (float?) v : null; 

Та же схема для CelsiusInput

// CelsiusInput = double.Parse(Console.ReadLine()); 
    double d; 
    CelsiusInput = double.TryParse(Console.ReadLine(), out v) d (double?) d : null; 

подстилающего механика кода

  • Мы пытаемся разобрать ввод данных пользователя TryParse(Console.ReadLine()...
  • Если разобрать успешно (и, таким образом, TryParse возвращает true), мы просто возвращаем (анализируемое значение).
  • Если разобрать не удается (и таким образом TryParse возвращается false) мы возвращающие некоторое специальное значение (-1 для UserChoice или null в случае FahrenheitInput или CelsiusInput)

P.S. в первом switch у вас есть только case 1, case 2 и case 5; однако, вы положили «Это не действительная запись. Введите 1, 2, 3, 4, или 5." в сообщении об ошибке. Кажется, что вы должны либо реализовать case 3 and case 4 в switch, либо отредактировать сообщение об ошибке.

0

Хотя все ответы, похоже на работу, вопрос, который вы просили был

как я могу предотвратить исключения из бросали [..]

, и я просто хочу укажите, что вы делаете это, положив деталь, которая выбрасывает exception в try - catch -block. Что это делает она выполняет код в try до достижения exception является неоспоримым выброшено, а затем передает эту exception S в качестве параметра в catch -части, где вы можете справиться с этим:

Примера

do 
{ 
    try 
    { 
     // the code you already have 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine("This is no valid input (" + ex.Message + ")! Try again..."); 
    } 
} while (UserChoice != 5); 

Конечно, предотвращение exception s от beeing n на первом месте - лучший способ (как и все другие ответы), но этот подход также работает и является более общим, если вы столкнетесь с подобной проблемой в будущем , Использование switch - case -условия для обработки ошибок - довольно распространенная практика ...

Смежные вопросы