Convert.ToBoolean fails with "0" value

c#, reference, type-conversion, types, value-type

Solution

This is happening because `Convert.ToBoolean` is expecting one of the following:

- `"True"` (String) = `true`

- `"False"` (String) = `false`

- `0` (numerical type; int, double, float, etc.) = `false`

- Any non-`0` (numerical type; ...) = `true`

- `null` = `false`

Any other value is invalid for `Boolean`.

You've already got a clean approach:

var myValue = Convert.ToBoolean(Convert.ToInt32("0"));

Edit: You can create an extension method that will handle a few of these cases for you, while hiding away the ugliness of handling the conversion.

This extension provides a very loose interpretation of `Boolean`:

- `"True"` (String) = `true`

- `"False"` (String) = `false`

- `"0"` (String) = `false`

- Any other string = `true`

Code:

public static class Extensions
{
    public static Boolean ToBoolean(this string str)
    {
        String cleanValue = (str ?? "").Trim();
        if (String.Equals(cleanValue, "False", StringComparison.OrdinalIgnoreCase))
            return false;
        return
            (String.Equals(cleanValue, "True", StringComparison.OrdinalIgnoreCase)) ||
            (cleanValue != "0");
    }
}

Alternatively, if you want a more strict approach, which follows what the .NET Framework expects; then simply use `try/catch` statements:

public static class Extensions
{
    public static Boolean ToBoolean(this string str)
    {
        try
        {
            return Convert.ToBoolean(str);
        }
        catch { }
        try
        {
            return Convert.ToBoolean(Convert.ToInt32(str));
        }
        catch { }
        return false;
    }
}

Albeit, not a clean or pretty approach, but it guarantees more possibilities of getting the correct value. And, the `Extensions` class is tucked away from your data/business code.

In the end, your conversion code is relatively simple to use:

String myString = "1";
Boolean myBoolean = myString.ToBoolean();

Problem

I'm trying to convert the value `"0"` ( `System.String` ) to its `Boolean` representation, like: ``` var myValue = Convert.ToBoolean("0"); // throwing an exception here ``` I've looked at the MSDN page, and in the code-sample block, I found these lines: ``` ConvertToBoolean("0"); // ... Unable to convert '0' to a Boolean. ``` In my code, I'm converting from the `System.String` to `Boolean` like this: ``` // will be OK, but ugly code var myValue = Convert.ToBoolean(Convert.ToInt32("0")); ``` - Is there any other way to convert to the `Boolean` type with not such ugly code? - Why does such an exception occur? Because of converting from the reference type `System.String` to the value type the `System.Boolean`, but `System.Int32` is also a value type, isn't it?

Original source