System.FormatException: входная строка имеет неправильный формат

    private void ReadUnitPrice()
    {
        Console.Write("Enter the unit gross price: ");
        unitPrice = double.Parse(Console.ReadLine());
    }

Это должно сработать, но мне не хватает чего-то очевидного. Всякий раз, когда я ввожу двойное значение, я получаю сообщение об ошибке: System.FormatException: входная строка имеет неправильный формат. Обратите внимание, что unitPrice объявлен как double.


person Petrus K.    schedule 23.09.2011    source источник
comment
Какие значения вы вводите?   -  person Michael Goldshteyn    schedule 23.09.2011
comment
значения в пределах 0-10, например 4.5 или 5.5   -  person Petrus K.    schedule 23.09.2011


Ответы (1)


Возможно, вы использовали неправильный символ разделения запятой или даже допустили другую ошибку при указании двойного значения. В любом случае в таких случаях вы должны использовать метод Double.TryParse (), который безопасен с точки зрения исключения и позволяет указать поставщика формата, в основном, культуру.

public static bool TryParse(
    string s,
    NumberStyles style,
    IFormatProvider provider,
    out double result
)

Метод TryParse похож на метод Parse (String, NumberStyles, IFormatProvider), за исключением того, что этот метод не создает исключение в случае сбоя преобразования. Если преобразование выполнено успешно, возвращаемое значение - истина, а параметр результата устанавливается равным результату преобразования. В случае сбоя преобразования возвращается значение false, а параметр результата устанавливается в ноль.

РЕДАКТИРОВАТЬ: ответ на комментарий

if(!double.TryParse(Console.ReadLine(), out unitPrice))
{
    // parse error
}else
{
   // all is ok, unitPrice contains valid double value
}

Также вы можете попробовать:

double.TryParse(Console.ReadLine(), 
                NumberStyle.Float, 
                CultureInfo.CurrentCulture, 
                out unitPrice))
person sll    schedule 23.09.2011
comment
да, я просто попробовал это на самом деле ... и угадайте что, это работает. Я ненавижу шведский символ разделения запятой сейчас .. - person Petrus K.; 23.09.2011
comment
TryParse принимает больше параметров в своем аргументе, и поскольку я новичок в C # и не совсем знаком с тем, куда TryParse затем отправляет результат (поскольку он возвращает bool), я пока буду придерживаться Parse. Получение 2 возвращаемых значений кажется мне немного не по себе, но я буду помнить о TryParse для будущего использования. Спасибо. - person Petrus K.; 23.09.2011
comment
@ Ryuji89: см. Обновленный ответ, часть ИЗМЕНИТЬ - person sll; 23.09.2011