Проблемы с типами данных при использовании TryParse в C#

Далее следует кнопка на форме. Пользователь вводит сумму в долларах в текстовое поле промежуточного итога и нажимает кнопку расчета. Затем вычисляется скидка и отображается общая сумма счета в текстовом поле в нижней части формы. Мы предполагаем использовать метод Parsing для преобразования записи в десятичную, если «$» вводится с промежуточной суммой. Мой вопрос касается успеха типа данных. Теперь это Bool, потому что это 1 или 0.

Когда я пытаюсь создать форму, я получаю эту ошибку:

Ошибка 1. Не удается неявно преобразовать тип «bool» в «decimal».

namespace InvoiceTotal
{
public partial class frmInvoiceTotal : Form
{
    public frmInvoiceTotal()
    {
        InitializeComponent();
    }

    private void btnCalculate_Click(object sender, EventArgs e)
    {
        decimal sucess = 0m;
        decimal subtotal = Decimal.TryParse(txtSubtotal.Text, out sucess);
        decimal discountPercent = .25m;
        decimal discountAmount = Math.Round(subtotal * discountPercent,2);
        decimal invoiceTotal = Math.Round(subtotal - discountAmount,2);

        txtDiscountPercent.Text = discountPercent.ToString("p1");
        txtDiscountAmount.Text = discountAmount.ToString(); // ("c");
        txtTotal.Text = invoiceTotal.ToString(); // ("c");

        txtSubtotal.Focus();
    }

Я предполагаю, что я не объявляю правильный тип данных для переменной «успех»? Если кто-то может помочь указать мне в правильном направлении, я был бы очень признателен!

* Ошибка 1 Невозможно неявно преобразовать тип «bool» в «decimal»

Я использую Visual Studio Professional 2012 на компьютере с Windows 8.1.


person Bob Glidewell    schedule 01.06.2014    source источник
comment
Decimal.TryParse возвращает bool, а не decimal. Вместо этого вам может понадобиться использовать метод Decimal.Parse. Или присвоение логического значения результату Decimal.TryParse. В следующий раз внимательно читайте сообщения об ошибках. Они здесь для вас.   -  person Soner Gönül    schedule 01.06.2014
comment
Всегда удобно сообщить нам, на какой строке у вас ошибка.   -  person Complexity    schedule 01.06.2014
comment
Я теперь это Bool, потому что это 1 или 0 ??? bool в С# - это true или false - не уверен, что вы имели в виду с 1 или 0...   -  person Alexei Levenkov    schedule 01.06.2014
comment
Если вы используете Visual Studio, у вас должны быть волнистые линии (красные или синие) под ошибками, чтобы показать вам, где они находятся. Наведите указатель мыши на эту часть кода, и всплывающая подсказка точно скажет вам, какая ошибка отмечена. Если вы все еще этого не понимаете, сообщите нам эту информацию, и мы сможем лучше помочь вам с вашей конкретной проблемой.   -  person ClickRick    schedule 01.06.2014


Ответы (3)


Хотя все остальные ответы верны, я хотел их расширить. Причина использования метода TryParse заключается в том, чтобы позволить вам лучше контролировать ход выполнения программы в случае неверного ввода. Другими словами, что бы вы хотели, чтобы произошло, если ввод неверен:

private void btnCalculate_Click(object sender, EventArgs e)
{
    decimal subtotal;

    if (!decimal.TryParse(txtSubtotal.Text, out subtotal))
    {
        //Display some warning to the user
        MessageBox.Show(txtSubtotal.Text + " is not a valid number");

        //don't continue processing input
        return;
    }

    //input is good, continue processing
    decimal discountPercent = .25m;
    decimal discountAmount = Math.Round(subtotal * discountPercent,2);
    decimal invoiceTotal = Math.Round(subtotal - discountAmount,2);
}

В некоторых случаях нет необходимости контролировать ход выполнения программы в случае плохой даты, потому что вы все равно просто сгенерируете исключение. В этом случае вы можете просто использовать Decimal.Parse, который выдаст FormatException.

person Philip Pittle    schedule 01.06.2014
comment
Почему вы инвертируете оператор if? Это функция void, и в возврате нет необходимости. - person Thomas Lindvall; 01.06.2014
comment
@ThomasLindvall Потому что остальная часть кода не может быть выполнена, если TryParse не возвращает достоверные данные. - person Leon Newswanger; 01.06.2014
comment
@ThomasLindvall - Леон Ньюсуэнгер прав. Идея состоит в том, чтобы остановить выполнение остальной части метода. Я мог бы поместить весь «основной» код в if (decimal.TryParse), но мне кажется, что так, как я написал, легче читать, но, в конце концов, это в основном проблема стиля. - person Philip Pittle; 01.06.2014
comment
Использование оператора return таким образом довольно распространено в C#. Его можно рассматривать как более явное, чем простое использование оператора else. Это говорит человеку, читающему код, что этот метод останавливается здесь. - person Leon Newswanger; 01.06.2014
comment
Спасибо за помощь мне. Кажется, что пример, который я использовал в учебнике, неверен. Он имеет код Decimal.TryParse. Когда я перехожу к нижнему регистру decimal.TryParse, ошибка исчезает. Обработка ошибок также отлично работает!!! Снова. Спасибо!!! - person Bob Glidewell; 01.06.2014
comment
@BobGlidewell decimal — это просто псевдоним структуры Decimal. Это на самом деле не должно иметь значения. - person Leon Newswanger; 01.06.2014
comment
@LeonNewswanger, так что же не так с оператором else? - person Thomas Lindvall; 01.06.2014
comment
@ThomasLindvall Думаю, ты меня неправильно понял. Нет ничего плохого в том, чтобы использовать else вместо возврата. Это совершенно правильный код. Некоторые люди просто предпочитают такой стиль использования return, а не else. Некоторые из нас находят его более читабельным. - person Leon Newswanger; 01.06.2014

TryParse() возвращает boolean, чтобы сообщить, был ли синтаксический анализ успешным или нет, он возвращает true, если синтаксический анализ был успешным, что означает, что значение было допустимым десятичным числом, и возвращает false, если он не может его проанализировать, и выводит значение в параметре out.

так должно быть:

decimal subtotal;
decimal invoiceTotal;
bool isDecimal= Decimal.TryParse(txtSubtotal.Text, out subtotal);

if(isDecimal)
{

    decimal discountPercent = .25m;
    decimal discountAmount = Math.Round(subtotal * discountPercent,2);
    invoiceTotal = Math.Round(subtotal - discountAmount,2);
}

Согласно MSDN< /а>:

Decimal.TryParse() Преобразует строковое представление числа в его десятичный эквивалент. Возвращаемое значение указывает, было ли преобразование успешным или неудачным.

См. подробности и пример в MSDN.

person Ehsan Sajjad    schedule 01.06.2014

В этой строке

decimal subtotal = Decimal.TryParse(txtSubtotal.Text, out sucess);

Вы назначаете логическое значение (тип возврата TryParse http://msdn.microsoft.com/it-it/library/9zbda557%28v=vs.110%29.aspx) в десятичную переменную, которая и является причиной ошибки.

Если вы хотите обработать успех операции, вы должны сделать что-то вроде:

bool success = Decimal.TryParse(txtSubtotal.Text, out subtotal);

а затем проверьте переменную success, чтобы убедиться, что преобразование было выполнено правильно.

person Saverio Terracciano    schedule 01.06.2014