Конвертировать.ToBoolean и логическое.Разбор не принимает 0 и 1


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

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

Что делает логические особенного? Они по сути 0 как false, а ненулевое значение как true в моем опыте...

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

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

6 59

6 ответов:

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

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

что делает логические особенного? Они по сути 0 как false, а ненулевое значение как true в моем опыте...

это деталь реализации, и это совсем не актуально.

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

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

!mystr.Equals("0");

общие 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 поставляемые в качестве 2-го аргумента преобразования.

значение по умолчанию используется, когда 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;
    }
}

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

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

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

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

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

вы хотите Convert.ToBoolean(int value) Не уверен, что с методами разбора :-)

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

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

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

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