在C#中使用TryParse遇到数据类型问题

时间:2014-06-01 17:07:16

标签: c# boolean decimal tryparse

以下是表单上的按钮。用户在小计文本框中输入美元金额并按下计算按钮。然后它会计算折扣并在表单底部的文本框中显示发票总额。我们假设使用Parsing方法将条目转换为十进制,如果" $"以小计金额输入。我的问题是数据类型成功。我现在是Bool,因为它是1或0。

当我尝试构建表单时,我收到此错误:

  

错误1无法隐式转换类型' bool'到十进制'

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'到十进制'

我在Windows 8.1计算机上使用Visual Studio Professional 2012。

3 个答案:

答案 0 :(得分:3)

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()将数字的字符串表示形式转换为其Decimal等效形式。返回值表示转换是成功还是失败。

查看有关MSDN

的详细信息和示例

答案 1 :(得分: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

答案 2 :(得分:2)

在这一行

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

您将布尔值(TryParse http://msdn.microsoft.com/it-it/library/9zbda557(v=vs.110).aspx的返回类型)分配给十进制变量,这是导致错误的原因。

如果您想要处理操作的成功,您应该执行以下操作:

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

然后检查变量成功以验证转换是否正确完成。