代码未转换文字

时间:2015-09-23 09:55:50

标签: c# asp.net

我有一个文本框,允许用户输入一个十进制值,然后存储在数据库的一个表中,这段代码在开发环境中工作。我现在已将我的项目发布到服务器,现在不再使用带小数位的值。

decimal ReceiptAmount;
decimal AmountDue;
decimal Change;
if (!string.IsNullOrEmpty(((TextBox)dl_Item.FindControl("tb_ReceiptAmount")).Text))
{
    if (((TextBox)dl_Item.FindControl("tb_ReceiptAmount")).Text.Contains(".") == true)
    {
        ReceiptAmount = Convert.ToDecimal(((TextBox)dl_Item.FindControl("tb_ReceiptAmount")).Text.Replace(".", ","));
    }
    else
    {
        ReceiptAmount = Convert.ToDecimal(((TextBox)dl_Item.FindControl("tb_ReceiptAmount")).Text);
    }
}
else
{
    ReceiptAmount = 0;
}
if (!string.IsNullOrEmpty(((TextBox)dl_Item.FindControl("tb_AmountDue")).Text))
{
    if (((TextBox)dl_Item.FindControl("tb_AmountDue")).Text.Contains(".") == true)
    {
        AmountDue = Convert.ToDecimal(((TextBox)dl_Item.FindControl("tb_AmountDue")).Text.Replace(".", ","));
    }
    else
    {
        AmountDue = Convert.ToDecimal(((TextBox)dl_Item.FindControl("tb_AmountDue")).Text);
    }
}
else
{
    AmountDue = 0;
}
if (!string.IsNullOrEmpty(((TextBox)dl_Item.FindControl("tb_Change")).Text))
{
    if (((TextBox)dl_Item.FindControl("tb_Change")).Text.Contains(".") == true)
    {
        Change = Convert.ToDecimal(((TextBox)dl_Item.FindControl("tb_Change")).Text.Replace(".", ","));
    }
    else
    {
        Change = Convert.ToDecimal(((TextBox)dl_Item.FindControl("tb_Change")).Text);
    }
}
else
{
    Change = 0;
}

我不确定这段代码似乎有什么问题。文本框位于我循环访问的数据列表中以获取所有值。

2 个答案:

答案 0 :(得分:1)

将字符串作为输入的.htaccess重载将使用Convert.ToDecimal解析字符串。您的服务器可能具有不同的区域设置。根据区域设置,逗号或点可以解释为千位分隔符(因此被忽略)或小数分隔符。

相反,您应该直接使用CultureInfo.CurrentCulture,根据您的使用情况提供特定文化或不变文化。

理想情况下,您可以在某处设置用户的文化。为实现这一点,有多种方法,例如,对于ASP.Net Web表单:https://msdn.microsoft.com/en-us/library/bz9tc508.aspx

如果使用正确的区域性解析字符串,则可以摆脱字符串操作,将Decimal.Parse替换为.

答案 1 :(得分:0)

首先,像

这样的行
  if (!string.IsNullOrEmpty(((TextBox)dl_Item.FindControl("tb_ReceiptAmount")).Text))

看起来非常难看;让提取方法(复制/粘贴非常非常糟糕练习):

  private String FindDLText(String controlName) {
    var box = dl_Item.FindControl(controlName) as TextBox;

    return box == null ? null : box.Text;
  }

如果您确实需要

,那么您不需要检查Text.Contains(".") == true,只需Replace

  private Decimal FindDLValue(String controlName) {
    String text = FindDLText(controlName); 

    if (String.IsNullOrEmpty(text))
      return 0.0M;

    //TODO: check if you really need this
    //text = text.Replace(".", ",");

    // you have to specify Culture either InvariantCulture or some predefined one;
    // say, new CultureInfo("ru-RU") // <- use Russian Culture to parse this
    return Decimal.Parse(text, CultureInfo.InvariantCulture);
  }

最后,你可以得到

  decimal ReceiptAmount = FindDLValue("tb_ReceiptAmount");
  decimal AmountDue = FindDLValue("tb_AmountDue");
  decimal Change = FindDLValue("tb_Change"); 

感受到差异:t 明显的行和两个简单的方法。