Convert.ToBoolean с ошибкой "0" - программирование
Подтвердить что ты не робот

Convert.ToBoolean с ошибкой "0"

Я пытаюсь преобразовать значение "0" (System.String) в его представление Boolean, например:

var myValue = Convert.ToBoolean("0"); // throwing an exception here

Я просмотрел страницу MSDN, и в блоке code-sample я нашел следующие строки:

ConvertToBoolean("0");
// ...
Unable to convert '0' to a Boolean.

В моем коде я конвертирую с System.String в Boolean следующим образом:

// will be OK, but ugly code
var myValue = Convert.ToBoolean(Convert.ToInt32("0"));
  • Есть ли другой способ преобразования в тип Boolean с не таким уродливым кодом?
  • Почему возникает такое исключение? Из-за преобразования из ссылочного типа System.String в тип значения System.Boolean, но System.Int32 также является типом значения, не так ли?
4b9b3361

Ответ 1

Это происходит потому, что Convert.ToBoolean ожидает одно из следующих действий:

  • "True" (String)= true
  • "False" (String)= false
  • 0 (числовой тип: int, double, float и т.д.) = false
  • Любой не 0 (числовой тип;...) = true
  • null= false

Любое другое значение недействительно для Boolean.

У вас уже есть чистый подход:

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

Изменить:. Вы можете создать метод расширения, который будет обрабатывать некоторые из этих случаев для вас, и скрыть уродство обработки преобразования.

Это расширение обеспечивает очень свободную интерпретацию Boolean:

  • "True" (String) = true
  • "False" (String) = false
  • "0" (String) = false
  • Любая другая строка = true

код:

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");
    }
}

В качестве альтернативы, если вам нужен более строгий подход, который следует за тем, что ожидает .NET Framework; затем просто используйте инструкции try/catch:

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;
    }
}

Хотя это не чистый или симпатичный подход, но он гарантирует больше возможностей для получения правильного значения. И класс Extensions спрятан от вашего кода данных/бизнеса.

В конце код конверсии относительно прост в использовании:

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

Ответ 2

public static class BooleanParser
{
    public static bool SafeParse(string value)
    {
        var s = (value ?? "").Trim().ToLower();
        return s == "true" || s == "1";
    }
}

Ответ 3

Так как это действительно вопрос о том, чтобы делать эти преобразования и т.д., как насчет метода расширения?

public static class Extensions {
    public static bool ToBool(this string s) {
        return s == "0" ? false : true;
    }
}

и тогда вы будете использовать его следующим образом:

"0".ToBool();

и теперь вы можете легко расширить этот метод, чтобы обрабатывать еще больше случаев, если хотите.

Ответ 4

Для успешной конверсии параметр значения должен быть равен Boolean.TrueString, константа, значение которой True, Boolean.FalseString, константа, значение которой False, или оно должно быть нулевым. При сравнении значения с Boolean.TrueString и Boolean.FalseString, метод игнорирует регистр, а также пробелы в начале и конце.

из MSDN

потому что Convert.ToBoolean ожидает true, если значение не равно нулю; в противном случае значение false. и True или False String.

Ответ 5

Если вы знаете, что это будет int, вы можете преобразовать его в int, а затем в bool. Следующее попытается выполнить преобразование в bool, попробовав строку, затем попытавшись с номером.

public bool ToBoolean(string value)
{
  var boolValue = false;
  if (bool.TryParse(value, out boolValue ))
  {
    return boolValue;
  }

  var number = 0;
  int.TryParse(value, out number))
  return Convert.ToBoolean(number);
}

Ответ 6

Быстро и просто:

public static class Extensions
{
        static private List<string> trueSet = new List<string> { "true","1","yes","y" };

        public static Boolean ToBoolean(this string str)
        {
            try
            { return trueSet.Contains(str.ToLower()); }
            catch { return false; }
        }
}

Ответ 7

Здесь очень прощающий парсер, который отбрасывает первый символ:

public static class StringHelpers
{
    /// <summary>
    /// Convert string to boolean, in a forgiving way.
    /// </summary>
    /// <param name="stringVal">String that should either be "True", "False", "Yes", "No", "T", "F", "Y", "N", "1", "0"</param>
    /// <returns>If the trimmed string is any of the legal values that can be construed as "true", it returns true; False otherwise;</returns>
    public static bool ToBoolFuzzy(this string stringVal)
    {
        string normalizedString = (stringVal?.Trim() ?? "false").ToLowerInvariant();
        bool result = (normalizedString.StartsWith("y") 
            || normalizedString.StartsWith("t")
            || normalizedString.StartsWith("1"));
        return result;
    }
}