Как бросить FormatException, когда ввод int вместо double?

Я должен бросить FormatException, если GPA вводится как int вместо double, но я не могу этого сделать. Однако я смог бросить FormatException, когда десятичное значение вводится в поле studentID. Что я знаю, так это то, что по умолчанию тип данных double принимает значение int, и поэтому он не генерирует исключение, но мне нужно убедиться, что значение, введенное как GPA, двойное.

using System;
using static System.Console;
// Declare a Student
// ID must be an integer and gpa must be a double to continue
namespace Debug4_4
{
    class Debug4_4
    {
        static void Main()
        {
            Student stu = new Student();
            bool areNumbersGood = false;
            while (!areNumbersGood)
            {
                try
                {
                    stu.setID();
                    stu.setGPA();
                    areNumbersGood = true;
                }
                catch (FormatException e)
                {
                    WriteLine(e.Message);
                    WriteLine("(Either the student ID or the GPA");
                    WriteLine(" was not in the correct format.)");
                    WriteLine("You will have to re-enter the student data.");
                }
            }
            WriteLine("Valid student");
        }
    }
    public class Student
    {
        private int stuId;
        private double stuGpa;
        public void setID()
        {
            string stuNumber;
            try
            {
                Write("Enter student ID ");
                stuNumber = ReadLine();
                stuId = Convert.ToInt32(stuNumber);
            }
            catch (FormatException fe)
            {
                throw (fe);
            }
        }

        //throw (fe);
        //}
        public void setGPA()
        {
            string stuGPAString;
            //string stuGPAString;
            try
            {
                Write("Enter student GPA ");
                stuGPAString = ReadLine();
                stuGpa = Convert.ToDouble(stuGPAString);

            }
            catch (FormatException fe)
            {
                throw (fe);
            }
        }
    }
}

person RSharma    schedule 04.10.2017    source источник
comment
У студента не может быть 4 GPA или 5 GPA? Если значение int, введенное пользователем, можно преобразовать в двойное, почему вы хотите иметь такую ​​​​проверку?   -  person Chetan Ranpariya    schedule 04.10.2017
comment
stuGpa ЯВЛЯЕТСЯ двойником. в чем именно проблема?: Вы заявили, что знаете, что int может быть преобразовано в double, и вы сохраняете ввод в поле double. Таким образом, вы уже гарантируете, что ввод является double.   -  person Rufus L    schedule 04.10.2017
comment
Пахнет домашней работой. Вместо того, чтобы перехватывать исключение для обнаружения ошибки, попробуйте Integer.TryParse и сгенерируйте собственное исключение в случае сбоя.   -  person Ňɏssa Pøngjǣrdenlarp    schedule 04.10.2017
comment
Кроме того, если единственной целью вашего catch является throw точное исключение, то вам вообще не нужны блоки try/catch. Они ничего не делают.   -  person Rufus L    schedule 04.10.2017
comment
Это мое домашнее задание. Меня просят проверить, введен ли GPA как двойной, и выдать необходимое исключение.   -  person RSharma    schedule 04.10.2017
comment
Я должен генерировать FormatException, если GPA вводится как int вместо double. Вы имеете в виду, что вы должны генерировать FormatException, если GPA вводится без десятичной точки?   -  person Tanner Swett    schedule 04.10.2017


Ответы (2)


Я предполагаю, что когда вы говорите, что ввод должен быть двойным, вы ожидаете, что ввод будет иметь десятичное число, например 4,0, вместо 4. Это довольно странное требование, но если это то, что вы ищете, вы можете достичь этого с помощью делать что-то вроде этого. Могут быть лучшие альтернативы, но это тоже подойдет

if (!(Double.TryParse(stuGPAString, out stuGpa) && stuGPAString.LastIndexOf(".") < (stuGPAString.Length - 1)))
{
    throw new FormatException("Invalid gpa");
};

но если вы просто хотите проверить, является ли gpa двойным, а если нет, то выдайте FormatException, тогда используйте это

if (!Double.TryParse(stuGPAString, out stuGpa))
{
   throw new FormatException("Invalid gpa");
};

Таким образом, ваш метод setGPA будет выглядеть так:

    public void setGPA()
    {
        string stuGPAString;

        if (!Double.TryParse(stuGPAString, out stuGpa))
        {
            throw new FormatException("Invalid student gpa");
        };
    }
person jbl    schedule 04.10.2017

Я думаю, вы можете использовать метод GetType().

var x=10;
x.GetType(); => int
var x=10.0;
x.GetType(); => double
person Amir    schedule 04.10.2017