Patryk
Patryk

Reputation: 24092

Why double.TryParse("0.0000", out doubleValue) returns false ?

I am trying to parse string "0.0000" with double.TryParse() but I have no idea why would it return false in this particular example. When I pass integer-like strings e.g. "5" it parses correctly to value of 5 .

Any ideas why it is happening ?

Upvotes: 41

Views: 47988

Answers (9)

Ola Gabrielson
Ola Gabrielson

Reputation: 1

The most stupid thing about this is that it only accept "," as decimal separator in my culture, but the result is with a ".". Someone, somewhere, wasn't very lucky thinking that day... So I'll try this:

if ((double.TryParse(sVat, out vat)) == false)
    if (double.TryParse(sVat.Replace(",", "."), out vat) == false)
      double.TryParse(sVat.Replace(".", ","), out vat);

Upvotes: -2

Yahia
Yahia

Reputation: 70369

it takes the localization settings at runtime into account... perhaps you are running this on a system where . is not the decimal point but , instead...

In your specific case I assume you want a fixed culture regardless of the system you are running on with . as the decimal point:

double.TryParse("0.0000", NumberStyles.Number, CultureInfo.CreateSpecificCulture ("en-US"), out temp)

OR

double.TryParse("0.0000", NumberStyles.Number,CultureInfo.InvariantCulture, out temp)

Some MSDN reference links:

Upvotes: 67

Cerveser
Cerveser

Reputation: 860

Changing the CultureInfo with TryParse did nothing for me. I had to change the number formats under Control Panel (Change, date, time, or number formats) and changed the Decimal symbol. Than it worked again.

Upvotes: 0

Kill Joy
Kill Joy

Reputation: 11

When this method returns, contains the double-precision floating-point number equivalent to the s parameter, if the conversion succeeded, or zero if the conversion failed.

From the MSDN page for this method.

http://msdn.microsoft.com/en-us/library/994c0zb1.aspx

Zero goes in, zero comes out.

Upvotes: 1

João Angelo
João Angelo

Reputation: 57688

It will return false if the current culture specifies a decimal point separator that is different than the . character.

When parsing strings representation you need to be aware in what culture they are represented otherwise you'll get unexpected behavior.

In this case you're getting false, but it could even be worse, for example in the following example if you were expecting to get the number one you would instead get one thousand:

Thread.CurrentThread.CurrentCulture = new CultureInfo("pt-PT");

double d;
Console.WriteLine(double.TryParse("1.000", out d));
Console.WriteLine(d);

This is because in the pt-PT culture the . character is used as NumberGroupSeparator and the , character is used as NumberDecimalSeparator.

If the input you're parsing comes from the user then always parse it using the culture the user is associated. Getting the culture the user is associated is something dependent on the context, for example in a Windows Forms application you would use Thread.CurrentThread.CurrentCulture when on the UI thread to get it. In a ASP.NET application this may be different.

Upvotes: 2

CodesInChaos
CodesInChaos

Reputation: 108800

TryParse uses the current culture by default. And if your current culture uses a decimal seperator different from ., it can't parse 0.0000 as you intend. So you need to pass in CultureInfo.InvariantCulture.

var numberStyle = NumberStyles.AllowLeadingWhite |
                 NumberStyles.AllowTrailingWhite |
                 NumberStyles.AllowLeadingSign |
                 NumberStyles.AllowDecimalPoint |
                 NumberStyles.AllowThousands |
                 NumberStyles.AllowExponent;//Choose what you need
double.TryParse( "0.0000", numberStyle, CultureInfo.InvariantCulture, out myVar)

Upvotes: 10

Tudor
Tudor

Reputation: 62439

To change the culture to something that has "." as decimal separator use:

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB");

Upvotes: 1

Jon
Jon

Reputation: 437376

Almost certainly the problem is that Thread.CurrentCulture does not use dot as the decimal separator.

If you know that the number will be always formatted with dot as the decimal separator, use this code that utilizes the other overload of double.TryParse:

style = NumberStyles.Float | NumberStyles.AllowThousands;
culture = CultureInfo.InvariantCulture;
float num;
if (double.TryParse("0.0000", style, culture, out num)) {
    // whatever
}

Upvotes: 3

Saeed Neamati
Saeed Neamati

Reputation: 35822

It works for me:

double temp = 0;
Console.WriteLine(double.TryParse("0.0000", out temp));
Console.ReadLine();

writes True.

Upvotes: -3

Related Questions