« When .NET 2.0 Applications Attack - Debu... | Main | ClickOnce and FireFox with a custom setu... »

Request.Browser.Version may not be a double

Posted 2005-11-11 11:37 AM in ASP.NET.

Avoid writing code like this to do browser detection:

if(Double.Parse(Request.Browser.Version) < 5.2) { // 5 or less

Why might this be a problem? Well, Request.Browser.Version is typed in the Base Class Library as a string. It's a string for a reason - because it may not necessarily be a double. When one writes Double.Parse(someString) they're basically saying that the folks who chose the type for Request.Browser.Version were mistaken, and that a double would have been a better chose.

This can be a problem when a browser like IE7.0 beta comes out and the value of Request.Browser.Version is "7.0b." This also applies to Mac's Safari and its User agent version which changed recently from 2.0 to 2.0.1 or 2.0.2.

Exception: Input string was not in a correct format.
Exception: System.FormatException
Message: Input string was not in a correct format.
Source: mscorlib
at System.Number.ParseDouble(String s, NumberStyles style, NumberFormatInfo info)
at System.Double.Parse(String s, NumberStyles style, IFormatProvider provider)
at System.Double.Parse(String s)

Unexpected exceptions tend to cramp one's style. I like the philosophy that "if you ever get an unexpected exception, you didn't test your code well enough." Why? Because clearly it wasn't anticipated, otherwise there'd have been code to handle it. This line (and the code around it you can't see) never expected a non-double to be in Request.Browser.Version, but the property's string type was the first tip that other things could happen.

Tracked by:
"To reiterate don’t sniff for browser versions" (Lazycoder) [Trackback]


Friday, November 11, 2005 3:06:24 PM (Pacific Standard Time, UTC-08:00)
Although in this case you are definitely correct, I don't think that "It's implemented as a string, so treat it as one" holds up very well in many parts of ASP.NET. Since the rendering of ASP.NET pages is limited to text, many things are implemented as strings when they shouldn't necessarily be.

Prime example: Selects such as drop downs and list boxes. In WinForm development, the value of a ListItem is an object, whereas in ASP.NET it is a string, so you end up doing a lot of Parse calls to get integer values.
Marty Thompson
Friday, November 11, 2005 3:07:27 PM (Pacific Standard Time, UTC-08:00)
"when they shouldn't necessarily be"

That doesn't sound right. Perhaps I mean, "when other objects might appear to be more appropriate".
Marty Thompson
Friday, November 11, 2005 3:30:27 PM (Pacific Standard Time, UTC-08:00)
I hear what you're saying, Marty. I don't mean "if it's a string, treat it as a string."

Instead I mean, "if it's a string, realize that it may well not be a double."
Friday, November 11, 2005 5:33:51 PM (Pacific Standard Time, UTC-08:00)
Or "if it's a version number, realize that there may well be a class out there like System.Version that would take care of all of that parsing for you in the context of version numbers."
Aaron Robinson
Friday, November 11, 2005 5:39:53 PM (Pacific Standard Time, UTC-08:00)
Not really...

System.Version v = new System.Version("7.0b"); //<-- exception here
Console.WriteLine(v.ToString());
Saturday, November 12, 2005 12:23:07 PM (Pacific Standard Time, UTC-08:00)
Obviously, you should never take formats like this for granted, but in this case there's another potential problem. Even 5.2 will not give you the expected result if the system doesn't have a point as decimal separator.
On your hosting server you may be pretty safe, but if you plan on distributing the code...
Saturday, November 12, 2005 8:20:20 PM (Pacific Standard Time, UTC-08:00)
In the end, everything is a string. All other data types are illusionary and transient. Just look at XML and serialization.
Comments are closed.

Contact

Sponsors

Hosting By

Hot Topics

Tags

Calendar

<November 2009>
SunMonTueWedThuFriSat
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

Archives

November, 2009 (5)
October, 2009 (19)
September, 2009 (11)
August, 2009 (12)
July, 2009 (21)
June, 2009 (26)
May, 2009 (16)
April, 2009 (13)
March, 2009 (17)
February, 2009 (17)
January, 2009 (18)
December, 2008 (32)
November, 2008 (17)
October, 2008 (22)
September, 2008 (16)
August, 2008 (14)
July, 2008 (25)
June, 2008 (19)
May, 2008 (17)
April, 2008 (17)
March, 2008 (26)
February, 2008 (21)
January, 2008 (28)
December, 2007 (19)
November, 2007 (17)
October, 2007 (31)
September, 2007 (39)
August, 2007 (37)
July, 2007 (43)
June, 2007 (37)
May, 2007 (32)
April, 2007 (38)
March, 2007 (29)
February, 2007 (46)
January, 2007 (31)
December, 2006 (27)
November, 2006 (31)
October, 2006 (32)
September, 2006 (39)
August, 2006 (34)
July, 2006 (40)
June, 2006 (18)
May, 2006 (31)
April, 2006 (34)
March, 2006 (30)
February, 2006 (38)
January, 2006 (44)
December, 2005 (19)
November, 2005 (34)
October, 2005 (24)
September, 2005 (37)
August, 2005 (20)
July, 2005 (24)
June, 2005 (33)
May, 2005 (16)
April, 2005 (22)
March, 2005 (34)
February, 2005 (15)
January, 2005 (37)
December, 2004 (28)
November, 2004 (30)
October, 2004 (34)
September, 2004 (22)
August, 2004 (34)
July, 2004 (18)
June, 2004 (64)
May, 2004 (49)
April, 2004 (21)
March, 2004 (29)
February, 2004 (29)
January, 2004 (36)
December, 2003 (25)
November, 2003 (24)
October, 2003 (59)
September, 2003 (42)
August, 2003 (24)
July, 2003 (44)
June, 2003 (29)
May, 2003 (21)
April, 2003 (30)
March, 2003 (27)
February, 2003 (47)
January, 2003 (50)
December, 2002 (31)
November, 2002 (38)
October, 2002 (44)
September, 2002 (15)
May, 2002 (2)
April, 2002 (4)

Google Ads