Подтвердить что ты не робот

Convert.ToBoolean и Boolean.Parse не принимают 0 и 1

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Это подробная информация о реализации и не имеет отношения к ней.

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

Если вы хотите разобрать что-то такое, что строка "0" оценивает false, а что-то другое оценивает true, вы можете использовать:

!mystr.Equals("0");

Ответ 3

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

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

Оба варианта обеспечивают случайное вхождение строки

1) Нормальное преобразование из строки в boolean по умолчанию для пустых или нулевых строк на 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;
    }
}

Ответ 4

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

Вы можете совершить круговое путешествие через целое число, чтобы получить то, что вы хотите.

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

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

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

Ответ 5

Вы хотите 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");
        }

Ответ 6

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

  byte i = 1; //or 0
  bool myBool = BitConverter.ToBoolean(new byte[] { i }, 0)

Ответ 7

Ответить на вопрос будет сложно. Может быть, потому что у узколобых разработчиков в Microsoft были свои причины? Нет неуважения, предназначенного для них. Просто сказать, что они не думали о том, для чего это нужно будет использовать или как это будет использоваться. Я не могу придумать причину, по которой мое расширение ниже не будет работать ни для кого. Я имею в виду, что логическое значение либо включено, либо выключено, истина или ложь. На мой взгляд, это в основном бинарный. Методы Parse для Int, Double, Char, Long, Byte и т.д. Более щадящие с их методами Parse.

Однако учтите это; Вы смотрите, существует ли значение в объекте. То же самое можно сказать и о следующем...

string myvar = "empty"; //Or maybe = "NULL"
if (String.IsNullOrEmpty(myvar))
{
    //Should this be true?
}

В любом случае, давайте просто сделаем это просто. Вот мое решение, использующее метод расширения для создания метода ToBoolean() для строки.

using System.Linq;
public static bool ToBoolean(this string input)
{
    //Define the false keywords
    String[] bFalse = { "false", "0", "off", "no" };

    //Return false for any of the false keywords or an empty/null value
    if (String.IsNullOrEmpty(input) || bFalse.Contains(input.ToLower()))
        return false;

    //Return true for anything not false
    return true;
}