2015-09-23 3 views
-3

У меня есть текстовое поле, которое позволяет пользователям вводить десятичные значения, которые затем сохраняются в таблице в базе данных, эта часть кода работает в среде разработки. Теперь я опубликовал свой проект на сервере, и теперь он больше не принимает значения с десятичными знаками.Код не преобразовывается текст

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; 
} 

Я не уверен, что это проблема с этим фрагментом кода. Текстовое поле найдено в datalist, который я прокручиваю, чтобы получить все значения.

+1

доброжелательно выровняйте свой код –

+2

Мои глаза так сильно болели – kevintjuh93

+0

Вы, кажется, много изменяете культуру, меняя десятичный разделитель, вместо этого вы должны просто разбирать его в любой культуре, в которой вы нуждаетесь. Что касается вашего фактического вопроса, какие ошибки вы получаете? – Sayse

ответ

1

Перегрузка, которая принимает строку в качестве входных данных, будет анализировать строку, используя CultureInfo.CurrentCulture. Вероятно, ваш сервер имеет разные региональные настройки. В зависимости от региональных настроек запятая или точка могут быть интерпретированы как тысячный разделитель (и, таким образом, игнорируются) или как разделитель десятичных чисел.

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

В идеале вы бы установили культуру пользователя где-нибудь. Для достижения этого существует множество подходов, например. для ASP.Net Веб-формы: https://msdn.microsoft.com/en-us/library/bz9tc508.aspx

Если вы разбираете строку, используя правильную культуру, вы можете избавиться от манипуляции с строкой для замены . на ,.

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 hree очевидных линий и двух простых методов.

Смежные вопросы