double.TryParse () Возвращает ноль (0), когда это не должно - PullRequest
0 голосов
/ 24 октября 2019

Так что, когда я имею дело с числами, все работает нормально, это просто когда я использую нечисловые записи. (Я помещаю комментарии там, где есть проблемы)

Когда вы вводите что-либо, кроме цифр, должно появиться сообщение об ошибке, а затем снова предложит вам ввести правильную запись. Если вы введете другое нечисловое значение вместо того, чтобы оставаться в цикле, tryParse изменит значение на 0 и, следовательно, выйдет из цикла и завершит программу. Как мне обойти это?

Я хочу выйти из цикла только тогда, когда введу 0, а не символ, который запускает tryParse, чтобы изменить символ на 0.

Я пытался удалитьtryParse в конце, но первое условие в операторе if делает его ложным, и поэтому диаметр по-прежнему становится равным 0.

    static void Main()
    {
    const double MINIMUM_DIAMETER = 12.0;
    const double MAXIMUM_DIAMETER = 36.0;
    double diameter, radius, area, sliceArea;
    string userInput;

    Console.Write("\nPlease enter the diameter of your pizza: ");
    userInput = Console.ReadLine();
        do
        {
            if (double.TryParse(userInput, out diameter) == false)
            {
                Console.WriteLine("\nENTRY NON-NUMBERIC ERROR\n");
                Console.WriteLine("Pizza must have a numeric diameter. You entered: \"{0}\"\n", userInput);
                Console.WriteLine("Please try again.\n");

                //**if userInput isn't valid, diameter becomes 0**
            }
            else
            {
                if (diameter < MINIMUM_DIAMETER || diameter > MAXIMUM_DIAMETER)
                {
                    //not important
                }
                else
                {
                    //not important
                }
            }
            Console.Write("\nPlease enter the diameter of your pizza (0 to end program): ");
            userInput = Console.ReadLine();
            double.TryParse(userInput, out diameter);
            Console.Clear();

            //**if userInput isn't valid, diameter becomes 0 and exits loop**

        } while (diameter != 0);
    }

Ответы [ 2 ]

0 голосов
/ 24 октября 2019

// , если userInput недействителен, диаметр становится 0

В этом случае и

// если userInput недействителен, диаметр становится равным 0 и выходит из цикла

Тогда проблема в том, что вы устанавливаете диаметр на 0 вне того, что выподелились? Выполнение проверки для 0 в else защищает его от значения по умолчанию 0 от TryParsing arg.

Эта ссылка выше, чтобы увидеть приведенный ниже код в действии:

using System;

public class Program
{
    public static void Main()
    {
        string userInput;
        double diameter;
        Console.Write("\nPlease enter the diameter of your pizza: ");
        userInput = Console.ReadLine();

        while(true)
        {
            var isDouble = double.TryParse(userInput, out diameter) == true;

            if (!isDouble)
            {
                Console.WriteLine("\nENTRY NON-NUMBERIC ERROR\n");
                Console.WriteLine("Pizza must have a numeric diameter. You entered: \"{0}\"\n", userInput);
                Console.WriteLine("Please try again.\n");
                diameter = 0;
                //**if userInput isn't valid, diameter becomes 0**
            }
            else
            {
                if (diameter == 0)
                {
                    Console.Write("\n Exit initiated");
                    break;
                }
            }

            Console.Write("\nPlease enter the diameter of your pizza (0 to end program): ");
            userInput = Console.ReadLine();
            double.TryParse(userInput, out diameter);
            Console.Clear();
        }
    }
}
0 голосов
/ 24 октября 2019

Проблема с методом double.TryParse. От Документы Microsoft :

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

Вы можете преодолеть это в своем коде:

bool success = true;
    do
    {
        if (double.TryParse(userInput, out diameter) == false)
        {
            Console.WriteLine("\nENTRY NON-NUMBERIC ERROR\n");
            Console.WriteLine("Pizza must have a numeric diameter. You entered: \"{0}\"\n", userInput);
            Console.WriteLine("Please try again.\n");
        }
        else
        {
            if (diameter < MINIMUM_DIAMETER || diameter > MAXIMUM_DIAMETER)
            {
                //not important
            }
            else
            {
                //not important
            }
        }
        Console.Write("\nPlease enter the diameter of your pizza (0 to end program): ");
        userInput = Console.ReadLine();
        Console.Clear();
        success = double.TryParse(userInput, out diameter);
    } while (diameter != 0 || !success);
...