При разборе строки на десятичное число генерируется исключение FormatException для DateTime - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть веб-проект, в котором есть данные различных инструментов, я могу вставлять и удалять инструменты в RadGrid (который подключен к базе данных), но у меня возникают проблемы с командой редактирования

Один из Значения инструментов - это «Стоимость», которая является десятичной, когда я пытаюсь редактировать, половину времени я получаю эту ошибку:

«Входная строка не была в правильном формате»

Это мой метод редактирования, когда пользователь нажимает на модальной форме редактирования, чтобы отправить правку

protected void btnMdlEditar_OnClick(object sender, EventArgs e)
       {
           NumberStyles style;
           CultureInfo provider;
           style = NumberStyles.AllowDecimalPoint;
           provider = new CultureInfo("en-US");
           decimal costoDecimal;
           var costo = editCosto.Text;
           costoDecimal = decimal.Parse(costo.ToString(),style,provider);
           try
           {
               var id = CDatos.DHerramientas.UpdateHerramientas(int.Parse(txtId.Text), editCodigo.Text, editNombreCorto.Text, editDescripcion.Text, costoDecimal, editConsumible.Text);
               rgHerramientas.DataBind();
               rgHerramientas.Rebind();
               upHerramientas.Update();
               this.ShowMessage(Resources.Language.mess_insert, "success");

           }
           catch (Exception ex) { this.ShowMessage(ex.Message, "danger"); }
           this.CloseModal("mdlHerramientaEdit");
       }

В строке

costoDecimal = decimal. Parse (costo.ToString (), style, provider);

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

protected void btnAutorizar_OnClick(object sender, EventArgs e)
       {
           NumberStyles style;
           CultureInfo provider;
           style = NumberStyles.AllowDecimalPoint;
           provider = new CultureInfo("en-US");
           decimal costoDecimal;
           var costo = txtCosto.Text;
           costoDecimal = decimal.Parse(costo.ToString(),style,provider);
           try
           {

               var id = CDatos.DHerramientas.InsertHerramientas(txtCodigo.Text, txtNombreCorto.Text, txtDescripcion.Text, costoDecimal, txtConsumible.Text);
               this.upDatos.Update();
               this.ShowMessage(Resources.Language.mess_insert, "success");

           }
           catch (Exception ex){this.ShowMessage(ex.Message, "danger"); }
           this.CloseModal("mdlHerramienta");
       }

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

7.85 to 7.89 = Error

7.85 to 6.12 = No error

У меня уже есть

, используя System.Globalization;

А моя текущая культура - "es-ES"

Редактировать: я пытался удалить "провайдера" из

costoDecimal = decimal.Parse (costo.ToString (), style, provider); что позволяет мне успешно редактировать, если я только изменяю часть номера, но если я набираю новый номер, используя "." это снова выдает ошибку

Я думаю, что проблема использует "." вместо "," - это метод, который используется в Испании для десятичных дробей, есть ли способ использовать оба "." и ","?

1 Ответ

0 голосов
/ 14 февраля 2020

Понял, источник проблемы использовал "," вместо "."

Из-за характера моего проекта я должен использовать культуру как "es-ES" для всего проекта.

Если "." вместо "," было выдано сообщение об ошибке, чтобы пользователи могли использовать "." и система для использования "," Мне пришлось изменить код

protected void btnMdlEditar_OnClick(object sender, EventArgs e)
        {
            NumberStyles style;
            CultureInfo provider;
            style = NumberStyles.AllowDecimalPoint;
            provider = new CultureInfo("en-US");
            decimal costoDecimal = 0;
            var costo = editCosto.Text;
            if (editCosto.Text.Contains("."))
            {
                costoDecimal = decimal.Parse(costo.ToString(), style, provider);
            }
            else if (editCosto.Text.Contains(","))
            {
                costoDecimal = decimal.Parse(costo.ToString(), style);
            }

            try
            {
                var id = CDatos.DHerramientas.UpdateHerramientas(int.Parse(txtId.Text), editCodigo.Text, editNombreCorto.Text, editDescripcion.Text, costoDecimal, editConsumible.Text);
                rgHerramientas.DataBind();
                rgHerramientas.Rebind();
                upHerramientas.Update();
                this.ShowMessage(Resources.Language.mess_insert, "success");

            }
            catch (Exception ex) { this.ShowMessage(ex.Message, "danger"); }
            this.CloseModal("mdlHerramientaEdit");
        }

Изменение культуры в зависимости от "," или "." был использован

...