Solved

Convert.ToDouble with negative number on OS X

Posted on 2011-09-19
8
648 Views
Last Modified: 2012-08-14
Hi,

In our Silverlight applicaiton when we uses Convert.ToDouble("-1") on an OS X (10.7) it crashes with:
"Unhandled Error in Silverlight 4 Application [Format_InvalidString]"

Any negative values will crash.

Even if we run a virtual Windows on the mac it will crash with the same error message. On a clean Windows machine it works fine.

Any help appreciated.
0
Comment
Question by:xlmaster200
  • 3
  • 2
  • 2
  • +1
8 Comments
 
LVL 14

Expert Comment

by:nishant joshi
Comment Utility
try to cast if convert not works well.

(Double)"-1";
0
 
LVL 16

Expert Comment

by:Easwaran Paramasivam
Comment Utility
Avoid exception using TryParse method.

if(Double.TryParse("-1") != null )
   Convert.ToDouble("-1");

0
 
LVL 16

Expert Comment

by:Easwaran Paramasivam
Comment Utility
Try to use Double.Parse("-1") then.

0
 

Author Comment

by:xlmaster200
Comment Utility
I could try to cast it but I'd really liked to now if anyone can explain why it's not working, is it a bug in the runtime?


0
IT, Stop Being Called Into Every Meeting

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

 
LVL 3

Accepted Solution

by:
smickle earned 500 total points
Comment Utility
I've had similar issues in the past. May not even be isolated to the Mac, but in my case it was the default Culture of the machine that was making stuff explode.

By default, .NET will use the default culture of the machine that is spinning up the runtime, unless you explicity specify which culture to use in your code or configurations. In order for the runtime to know "how" to convert something from some string to a typed double, it uses a format string to determine the conversion pattern.

I ended up having to do stuff like this:
 
// use InvariantCulture
var someDouble = Double.Parse("1234.0",CultureInfo.InvariantCulture);

Open in new window


By using InvariantCulture, the runtime didn't have to use the machine's default culture and possibly change it's conversion pattern. In my code snipped above, the dot in 1234.0 was getting interpretted as a thousands separator in a different culture. So I got the weird FormatException.

This is just a guess as a possibility of why it is happening.

In my case, I was pulling my hair out thinking is was something to do with the difference between a 32-bit system and a 64-bit system. It was just coincidental that the OS's were different, so that lead me down way too many wrong turns to a solution.

Hope this helps.

-Steve
0
 

Author Comment

by:xlmaster200
Comment Utility
Thanks for your answer Steve.
So in other words I can't use Convert.ToDouble (or Convert.ToInt16) anywhere in the code...
I did some test on the client side for a Mac:
string s = "-1";
double d =Convert.ToDouble(s)   - Unhandled Error in Silverlight 4 Application [Format_InvalidString]
double d = Double.Parse(s)  - Unhandled Error in Silverlight 4 Application [Format_InvalidString]
double d = Double.Parse(s,CultureInfo.InvariantCulture) - OK

What culture does not accept "-" before a number? If I try cdbl("-1") in a VBA macro on the Mac it works OK.

It feels no good to change Convert.ToDouble everywhere in the code.
0
 

Author Comment

by:xlmaster200
Comment Utility
I printed out CultureInfo.CurrentCulture.NumberFormat.NegativeSign and found that on the Mac the NegativeSign was a little longer than in Windows... Silly me not thinking of that...

So I go with your suggestion Steve and use InvariantCulture on the client side
0
 
LVL 3

Expert Comment

by:smickle
Comment Utility
Ha, extra long negative sign. That's great.

You might be able to get around changing all the code, and you can explicitly set your desired culture in web.config, if this is an asp.net app. Not sure if this will work off the top of my head, but it could. This would ensure that all your conversions in your code that run within your web app will use a preset culture.

 
<!-- system.web section inside your web.config -->
<globalization culture="en-US"/>

Open in new window


Globalization can be a headache in many sneaky ways though. Especially if you have values stored and retrieved from SQL Server for example. And the SQL Server has a different culture setting than the code that uses it. They must match in order to get predictable results. DateTime formats and conversions are the main ones that get hosed in that scenario due to the different order of the mm/dd/yy structure.
0

Featured Post

Free Trending Threat Insights Every Day

Enhance your security with threat intelligence from the web. Get trending threat insights on hackers, exploits, and suspicious IP addresses delivered to your inbox with our free Cyber Daily.

Join & Write a Comment

Suggested Solutions

IntroductionWhile developing web applications, a single page might contain many regions and each region might contain many number of controls with the capability to perform  postback. Many times you might need to perform some action on an ASP.NET po…
If you other experts are anything like me you are always looking into and testing out new features. While I was doing some research one day I ran across an app that I installed on my Mac and used as a security system. Mac OS X: SecureHome uses your …
It is a freely distributed piece of software for such tasks as photo retouching, image composition and image authoring. It works on many operating systems, in many languages.
When you create an app prototype with Adobe XD, you can insert system screens -- sharing or Control Center, for example -- with just a few clicks. This video shows you how. You can take the full course on Experts Exchange at http://bit.ly/XDcourse.

772 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

9 Experts available now in Live!

Get 1:1 Help Now