4

我正在裁剪图像并保存。在 btnsave_click 上,我将隐藏字段值转换为十进制。本地机器上没有错误,但是当发布到服务器时,它给出了以下错误。

服务器上的详细异常

输入字符串的格式不正确。

说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.FormatException:输入字符串的格式不正确。

源错误:

在执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常起源和位置的信息。

堆栈跟踪:

[FormatException: 输入字符串格式不正确。]
System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal) +10726387 System.Number.ParseDecimal(String value, NumberStyles options, NumberFormatInfo numfmt ) +172
System.Convert.ToDecimal(String value) +68
IngredientMatcher.Pages.ImageCropPopup.btnsave_Click(Object sender, 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 postData) +35 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean 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);
}

提前致谢。

4

3 回答 3

4

您的问题在于用于转换小数的文化。有些文化使用 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")为您的文化。

于 2013-06-29T10:21:07.567 回答
1

在尝试执行任何转换操作之前,您应该确保转换的值是有效的数字而不是空字符串。要获得此结果,最好的方法是通过 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));
于 2013-06-29T10:44:12.653 回答
0

web.config,system.web部分中添加此内容,将文化更改为本地区域:

<globalization
   fileEncoding="utf-8"
   requestEncoding="utf-8"
   responseEncoding="utf-8"
   culture="es-PA"
   uiCulture="de-DE"
/>
于 2019-08-15T19:49:27.970 回答