tags:

views:

210

answers:

3

I havethe following code which outputs the number '40':

Hashtable ht = new Hashtable();
ht.Add("numRooms", pageData.Property["romtotalt"].ToString());
string str = ht["numRooms"].ToString();
lblMigrate.Text = i.ToString();

Then I try to convert the string to an int, and I get an exception / error:

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();

This is the error message I get:

Server Error in '/' Application.
Input string was not in a correct format.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.FormatException: Input string was not in a correct format.

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace:

[FormatException: Input string was not in a correct format.]
   System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal) +7469351
   System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info) +119
   development.templates.HotellGuide.btnMigrateHotels_Click(Object sender, EventArgs e) +956
   System.Web.UI.WebControls.Button.OnClick(EventArgs e) +111
   System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +110
   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) +36
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1565


Version Information: Microsoft .NET Framework Version:2.0.50727.3082; ASP.NET Version:2.0.50727.3082

I don't understand what's wrong. I'va castet string to int multiple times before, and never has this problem occured.

Please help :)

Update

I have found a solution. I have NO idea why this works.... but it works...
I put the convertion inside a Try Catch, and now it works. Figure that one out :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);
}
A: 

I think the line "Input string was not in a correct format" explains it all. In the line

 int i = Convert.ToInt32(str);

str might be containing alphabetic characters. Take a look at it while debugging, what does it contain?

erelender
I'm using Visual Web Developer 2008 and I haven't been able to make the debugging work :( The input string only contains the number '40' and maybe white space. Therefor I don't understand what it merans by 'incorrect format'
Steven
"and maybe white space" <-- Then you better use str.Trim(), because if you maybe have white space then maybe that will crash the function.
Michael Stum
A: 

The code is ok, but if the str may have white space, so you should remove them before convert:

int i = Convert.ToInt32(str.Replace(" " ,""));  // <-- This is where it fails I t hink. But why??
Wael Dalloul
Addin Trim() does not help. Whitespace is not the problem.
Steven
+1  A: 

You should add Trim() to your code-line where you think it fails. It probably has to do with excessive spaces.

int i = Convert.ToInt32(str.Trim());

Maybe even check to see if str is string.Empty, this will also cause Convert.ToInt32 to crash.

if (string.IsNullOrEmpty(str)) {
    str = "0";
}
Seb Nilsson
The string is not empty, it contains the number '40'. Also adding Trim() dfoes not help.
Steven
@Steven: `Convert.ToInt32` *will* work if the string contains just the two characters "40" and nothing else.
LukeH
@Luke: Normally yes. But in this case, no. See my solution.
Steven
@Steven: It looks like your "solution" is just burying the error in a `try`...`catch`, rather than preventing it.
LukeH