Конвертировать.ToBoolean и логическое.Разбор не принимает 0 и 1
Почему было решено, что при анализе логического 0/1 не приемлемы?
при анализе любого значения целочисленного типа он принимает числовые строки для анализа. (И если .NET может разобрать строку "сто миллионов двести шестьдесят пять тысяч восемьсот шестьдесят пять", я был бы удивлен).
Что делает логические особенного? Они по сути 0 как false, а ненулевое значение как true в моем опыте...
есть ли метод bcl для разбора a струна такая, а если нет, то почему?
примечание: Я забыл указать в строке "0" и "1". Любопытно, что если уже int он работает так, как я ожидал. Может быть, это и вызвало замешательство.
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/off2) следует тем же правилам, что и 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"); }