C # Входная строка имеет неправильный формат. Проблема преобразования на сервере не на локальном компьютере

Я обрезаю изображение и сохраняю. В btnsave_click я конвертирую значение скрытого поля в десятичное. На локальном компьютере ошибки нет, но при публикации на сервере выдается ошибка ниже.

Подробное исключение на сервере:

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

Описание: необработанное исключение произошло во время выполнения текущего веб-запроса. Просмотрите трассировку стека для получения дополнительных сведений об ошибке и ее происхождении в коде.

Сведения об исключении: System.FormatException: входная строка имеет неправильный формат.

Ошибка источника:

Необработанное исключение было создано во время выполнения текущего веб-запроса. Информацию о происхождении и местонахождении исключения можно определить с помощью трассировки стека исключений ниже.

Трассировки стека:

[FormatException: входная строка имеет неправильный формат.]
System.Number.StringToNumber (String str, параметры NumberStyles, NumberBuffer & number, информация NumberFormatInfo, логическое parseDecimal) +10726387 System.Number.ParseDecimal (значение строки, параметры NumberStyles , NumberFormatInfo numfmt) +172
System.Convert.ToDecimal (строковое значение) +68
IngredientMatcher.Pages.ImageCropPopup.btnsave_Click (отправитель объекта, EventArgs e) +104
System.Web.UI.WebControls. Button.OnClick (EventArgs e) +9552602
System.Web.UI.WebControls.Button.RaisePostBackEvent (String eventArgument) +103
System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler. RaisePostBackEvent (String eventArgument) +10
System.Web.UI.Page.RaisePostBackEvent (IPostBackEventHandler sourceControl, String eventArgument) +13
System.Web.UI.Page.RaisePostBackEvent (NameValueCollection System.Web) +35. UI.Page.ProcessRequestMain (логическое includeStagesBeforeAsyncPoint, Boo Lean includeStagesAfterAsyncPoint) +1724

Код::

protected void btnsave_Click(object sender, EventArgs e)
{
    string ImageName = ViewState["ImageName"].ToString();
    int www = Convert.ToInt32(Math.Round(Convert.ToDecimal(W.Value)));
    int hhh = Convert.ToInt32(Math.Round(Convert.ToDecimal(H.Value)));
    int xxx = Convert.ToInt32(Math.Round(Convert.ToDecimal(X.Value)));
    int yyy = Convert.ToInt32(Math.Round(Convert.ToDecimal(Y.Value)));
    int w = (www == 0) ? 0 : www;
    int h = (hhh == 0) ? 0 : hhh;
    int x = (xxx == 0) ? 0 : xxx;
    int y = (yyy == 0) ? 0 : yyy;

    byte[] CropImage = Crop(Server.MapPath(" ") + "\\" + upPath + ImageName, w, h, x, y);
    using (MemoryStream ms = new MemoryStream(CropImage, 0, CropImage.Length))
    {
        ms.Write(CropImage, 0, CropImage.Length);
        using (SD.Image CroppedImage = SD.Image.FromStream(ms, true))
        {
            string SaveTo = Server.MapPath("") + "\\" + CropPath + "crop" + ImageName;

            CroppedImage.Save(SaveTo, CroppedImage.RawFormat);
            imgCropped.BorderWidth = 1;
            imgCropped.ImageUrl = CropPath + "crop" + ImageName;
        }
    }
    string CroppedImg = "crop" + ViewState["ImageName"].ToString();

    ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "OpenPopUp", "javascript:SaveAndClose('" + CroppedImg + "');", true);
}

Заранее спасибо.


person Janty    schedule 29.06.2013    source источник
comment
Исключение указывает на Convert.ToDecimal, поэтому проблема заключается в значениях W, H, X, Y. Вероятно, одна из них - пустая строка, и Convert.ToDecimal это не нравится   -  person Steve    schedule 29.06.2013
comment
Честно говоря, лучшим решением будет сбросить туда некоторую отладку, возможно, записать или зарегистрировать значения WHXY, и это даст вам ответ.   -  person NibblyPig    schedule 29.06.2013


Ответы (3)


Ваша проблема заключается в культуре, используемой для преобразования десятичной дроби. В некоторых культурах используется 0,01, а в других - 0,01. в этом проблема.

Вы можете использовать инвариантную культуру (всегда 0,01 в качестве входных данных), например:

int www = Convert.ToInt32(Math.Round(Convert.ToDecimal(W.Value, System.Globalization.CultureInfo.InvariantCulture)));
int hhh = Convert.ToInt32(Math.Round(Convert.ToDecimal(H.Value, System.Globalization.CultureInfo.InvariantCulture)));
int xxx = Convert.ToInt32(Math.Round(Convert.ToDecimal(X.Value, System.Globalization.CultureInfo.InvariantCulture)));
int yyy = Convert.ToInt32(Math.Round(Convert.ToDecimal(Y.Value, System.Globalization.CultureInfo.InvariantCulture)));

Или вы можете использовать свою культуру, просто заменив System.Globalization.CultureInfo.InvariantCulture на CultureInfo.CreateSpecificCulture("nl-NL"), где строка конструктора заменяется вашей культурой.

person SynerCoder    schedule 29.06.2013
comment
Да, это может сработать, но что такое W, H, X, Y? Если есть вероятность, что эти Value содержат пустую строку, код снова выдаст исключение - person Steve; 29.06.2013

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

decimal dw;
decimal dh;
decimal dx;
decimal dy;

int www = 0;
int hhh = 0;
int xxx = 0;
int yyy = 0;

CultureInfo ci = CultureInfo.CreateSpecificCulture("en-GB");  // Here your specific culture

if(decimal.TryParse(W.Value, NumberStyles.AllowDecimalPoint, ci, out dw))
    www = Convert.ToInt32(Math.Round(dw));
if(decimal.TryParse(W.Value, NumberStyles.AllowDecimalPoint, ci, out dh))
    hhh = Convert.ToInt32(Math.Round(dh));
if(decimal.TryParse(W.Value, NumberStyles.AllowDecimalPoint, ci, out dx))
    xxx = Convert.ToInt32(Math.Round(dx));
if(decimal.TryParse(W.Value, NumberStyles.AllowDecimalPoint, ci, out dy))
    yyy = Convert.ToInt32(Math.Round(dy));
person Steve    schedule 29.06.2013
comment
Я взял значение по умолчанию для скрытого поля как 0. ТАК, что нет шансов пусто. Спасибо за ответ - person Janty; 29.06.2013

В web.config, в разделе system.web добавьте это, измените культуру на локальный регион:

<globalization
   fileEncoding="utf-8"
   requestEncoding="utf-8"
   responseEncoding="utf-8"
   culture="es-PA"
   uiCulture="de-DE"
/>
person Jorge Diaz    schedule 15.08.2019