C# 无法将字符串强制转换为int。错误消息:输入字符串的格式不正确

C# 无法将字符串强制转换为int。错误消息:输入字符串的格式不正确,c#,.net,C#,.net,我有以下输出数字“40”的代码: Hashtable ht = new Hashtable(); ht.Add("numRooms", pageData.Property["romtotalt"].ToString()); string str = ht["numRooms"].ToString(); lblMigrate.Text = i.ToString(); 然后,我尝试将字符串转换为int,得到一个异常/错误: Hashtable ht = new Hashtable(); ht.Ad

我有以下输出数字“40”的代码:

Hashtable ht = new Hashtable();
ht.Add("numRooms", pageData.Property["romtotalt"].ToString());
string str = ht["numRooms"].ToString();
lblMigrate.Text = i.ToString();
然后,我尝试将字符串转换为int,得到一个异常/错误:

Hashtable ht = new Hashtable();
ht.Add("numRooms", pageData.Property["romtotalt"].ToString());
string str = ht["numRooms"].ToString();
int i = Convert.ToInt32(str);  // <-- This is where it fails I t hink. But why??
lblMigrate.Text = i.ToString();
我不明白怎么了。我以前多次将字符串转换为int,但从未发生过此问题

请帮忙:)

更新

我找到了解决办法。我不知道为什么会这样。。。。但它是有效的…
我将转换放在一个Try-Catch中,现在它工作了。算出一个:op

int numRooms = 0;
int numAllergyRooms = 0;

try
{
    numRooms = Convert.ToInt32(newHotel["numRooms"].ToString().Trim());
    numAllergyRooms = Convert.ToInt32(newHotel["numAllergyRooms"].ToString().Trim());
}
catch (Exception ex)
{
    Console.WriteLine("{0} Exception caught.", ex);
}
我认为“输入字符串格式不正确”一行解释了这一切。排队

 int i = Convert.ToInt32(str);

str可能包含字母字符。调试时查看一下,它包含哪些内容?

代码正常,但如果str可能有空格,则应在转换之前删除:

int i = Convert.ToInt32(str.Replace(" " ,""));  // <-- This is where it fails I t hink. But why??
inti=Convert.ToInt32(str.Replace(“,”);// 您应该将Trim()添加到您认为失败的代码行中。这可能与空间过大有关

int i = Convert.ToInt32(str.Trim());
甚至可以检查str是否为string.Empty,这也会导致Convert.ToInt32崩溃

if (string.IsNullOrEmpty(str)) {
    str = "0";
}

我也有同样的问题,但只有试着抓住方法解决了我的问题

        try
        {
            decimal dPrice=Convert.ToDecimal(sPrice);
            decimal dFreight = Convert.ToDecimal(sFreight);
            decimal dLocalship = Convert.ToDecimal(sLocalship);
            decimal dTarrif = Convert.ToDecimal(sTarrif);
            decimal dBenefit = Convert.ToDecimal(sBenefit);
            decimal dTax = Convert.ToDecimal(sTax);
            decimal dVat = Convert.ToDecimal(sVat);
            decimal dConv = Convert.ToDecimal(sConv);
            decimal factors=(dTarrif+dBenefit+dTax+dVat)/100+1;
            decimal dTotal=(dPrice+dFreight)*dConv;
            dTotal=dTotal*factors;
            string st = Convert.ToString(dTotal);
            e.Row.Cells[iCell].Text = "price is: " + st + " Rials";
        }
        catch(Exception ex)
        {
            Console.WriteLine("{0} Exception caught.", ex);
        }

可能是您试图将null或在本例中的“”(在
.ToString()
之后)转换为int

尝试为空值插入可接受的占位符,如下面代码中所示的-1

Convert.ToInt32(newHotel["numAllergyRooms"].ToString().Trim() == "" ? "-1" : newHotel["numAllergyRooms"].ToString().Trim());

原因也可能是注册表问题。看

他们解释说,如果值HKEY\U CURRENT\U USER\Control Panel\International\SPOSTIVESIGN包含不正确的内容,则正确的数字字符串可能仍然无法转换。在我们这个地区,这个键的值应该是空的(没有空格,只是空的)


可能这不是你的问题,但我在这里为可能正是这个原因导致他们问题的人添加它…

你不是在将字符串转换为int,而是在转换。也称为转换;o) 。我知道propert casting是例如(Int23)myString,但如果不起作用,您必须进行PAR或转换。我认为您应该调试应用程序,尝试在转换前使用showmessage查看str。这可能与此相关:我使用的是Visual Web Developer 2008,但我无法使调试工作正常:(输入字符串仅包含数字“40”和可能的空白。因此,我不理解“格式不正确”和可能的空白“Addin Trim()没有帮助。空白不是问题。字符串不是空的,它包含数字“40”。同时添加Trim())数据没有帮助。@Steven:
Convert.ToInt32
如果字符串只包含两个字符“40”而不包含其他字符,则可以使用。@Luke:通常是。但在这种情况下,不是。请参阅我的解决方案。@Steven:看起来像是您的“解决方案”只是将错误隐藏在一个
try
catch
,而不是阻止它。同样的问题,只有try-catch有效,检查了我能想到的所有可能的字符组合、换行符、空格。。。
Convert.ToInt32(newHotel["numAllergyRooms"].ToString().Trim() == "" ? "-1" : newHotel["numAllergyRooms"].ToString().Trim());