我有一个文本框,允许用户输入一个十进制值,然后存储在数据库的一个表中,这段代码在开发环境中工作。我现在已将我的项目发布到服务器,现在不再使用带小数位的值。
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;
}
我不确定这段代码似乎有什么问题。文本框位于我循环访问的数据列表中以获取所有值。
答案 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 明显的行和两个简单的方法。