Convert.ToBoolean и Boolean.Parse не принимают 0 и 1 - PullRequest
62 голосов
/ 15 декабря 2009

Почему было решено, что при разборе логического значения 0/1 неприемлемы?

При синтаксическом анализе любого целочисленного значения он принимает числовые строки для анализа. (И если .NET сможет разобрать строку «Сто миллионов двести шестьдесят пять тысяч восемьсот шестьдесят пять», я бы удивился).

Что делает булевы особенными? Они, по сути, равны 0 как ложные, и ненулевые как истинные в моем опыте ...

Есть ли метод bcl для анализа такой строки, и если нет, то почему?

Примечание: я забыл указать в строке «0» и «1». Любопытно, что, если уже int, он работает, как я ожидал. Может быть, это вызвало путаницу.

Ответы [ 6 ]

64 голосов
/ 15 декабря 2009

0 и (не ноль) не равны «ложь» и «истина», это просто представление, выбранное C. Другие языки используют 0 для истины и -1 для ложных, или другие схемы полностью. Логическое значение не 0 или 1, это истина или ложь.

Должно ли оно обрабатывать «да» и «нет», «выключено» и «включено», и все множество других вещей, аналогичных логическим значениям? Где бы вы нарисовали линию?

28 голосов
/ 15 декабря 2009

Что делает булевы особенными? По сути, они равны 0 как ложные, и, по моему опыту, отличны от нуля ...

Это детали реализации, и они вообще не актуальны.

true - логическое значение. false - логическое значение. Ничего другого нет.

Если вы хотите проанализировать что-то такое, что строка «0» оценивает false, а все остальное оценивает true, вы можете использовать:

!mystr.Equals("0");
18 голосов
/ 07 сентября 2012

Класс FormatHelper общего доступа, показанный ниже, предоставляет простое решение с использованием двух вариантов перегруженного метода, называемого StringToBoolean.

FormatHelper.StringToBoolean(String value)
FormatHelper.StringToBoolean(String value, Boolean NullOrEmptyDefault)

Оба варианта обеспечивают совпадение строк без учета регистра

1) Нормальное преобразование из строки в логическое значение по умолчанию для пустых или нулевых строк в false

Следующие примеры приведут к значению boolean false: -

 Boolean myBool = FormatHelper.StringToBoolean("");
 Boolean myBool = FormatHelper.StringToBoolean("0");
 Boolean myBool = FormatHelper.StringToBoolean("false");
 Boolean myBool = FormatHelper.StringToBoolean("False");
 Boolean myBool = FormatHelper.StringToBoolean("no");
 Boolean myBool = FormatHelper.StringToBoolean("off");

Все остальные строковые значения приведут к Boolean значению true, например: -

 Boolean myBool = FormatHelper.StringToBoolean("1");
 Boolean myBool = FormatHelper.StringToBoolean("true");
 Boolean myBool = FormatHelper.StringToBoolean("True");
 Boolean myBool = FormatHelper.StringToBoolean("yes");
 Boolean myBool = FormatHelper.StringToBoolean("xyz blah");

Примечание: отредактируйте значение BooleanStringOff в классе ниже, чтобы включить больше (или меньше) значений для false / off

2) Следует тем же правилам, что и 1) выше, но допускает предоставление значения по умолчанию true в качестве второго аргумента преобразования.

Значение по умолчанию используется, когда значение String пусто или null. Это полезно, если пропущенное строковое значение должно обозначать состояние true.

Следующий пример кода вернет true

 Boolean myBool = FormatHelper.StringToBoolean("",true);

Следующий пример кода вернет false

 Boolean myBool = FormatHelper.StringToBoolean("false",true);

Это код для FormatHelper класса

public class FormatHelper
{
    public static Boolean StringToBoolean(String str)
    {
        return StringToBoolean(str, false);
    }

    public static Boolean StringToBoolean(String str, Boolean bDefault)
    {
        String[] BooleanStringOff = { "0", "off", "no" };

        if (String.IsNullOrEmpty(str))
            return bDefault;
        else if(BooleanStringOff.Contains(str,StringComparer.InvariantCultureIgnoreCase))
            return false;

        Boolean result;
        if (!Boolean.TryParse(str, out result))
            result = true;

        return result;
    }
}
8 голосов
/ 15 декабря 2009

К сожалению, это часто случается в .NET. Например, я не могу вспомнить, является ли это XML Serializer или XmlConvert, но один из них завершается ошибкой, если регистр True / False неверен.

Вы можете отправлять туда и обратно через целое число, чтобы получить то, что вы хотите.

string s = "2";
int i = Convert.ToInt32(s);
bool b = Convert.ToBoolean(i);

В приведенном выше случае все ненулевое значение будет иметь значение true.

По этой причине я создал класс, который я использую повсюду, называемый ConversionStrategy, который учитывает тип источника и тип назначения и выбирает наиболее идеальную (и гибкую) стратегию преобразования для выполнения преобразования.

3 голосов
/ 28 июля 2012

Как насчет этого?

  byte i = 1; //or 0
  bool myBool = BitConverter.ToBoolean(new byte[] { i }, 0)
3 голосов
/ 15 декабря 2009

Вы хотите Convert.ToBoolean(int value) не уверены, что случилось с методами Parse: -)

Код без какой-либо полезной цели:

        int falseInt = 0;
        int trueInt = 1;

        bool falseBool;
        bool trueBool;

        if (bool.TryParse(falseInt.ToString(), out falseBool))
        {
            if (!falseBool)
            {
                MessageBox.Show("TryParse: False");
            }
        }

        if (bool.TryParse(trueInt.ToString(), out trueBool))
        {
            if (!trueBool)
            {
                MessageBox.Show("TryParse: True");
            }
        }

        falseBool = Convert.ToBoolean(falseInt);
        trueBool = Convert.ToBoolean(trueInt);

        if (!falseBool)
        {
            MessageBox.Show("Convert: False");
        }

        if (trueBool)
        {
            MessageBox.Show("Convert: True");
        }
...