Convert.ToBoolean и Boolean.Parse не принимают 0 и 1
Почему было решено, что при анализе логических значений 0/1 неприемлемы?
При анализе любого значения целочисленного типа он принимает числовые строки, которые нужно разобрать. (И если .NET сможет разобрать строку "Сто миллионов двести шестьдесят пять тысяч восемьсот шестьдесят пять", я был бы удивлен).
Что делает булевы особенными? Они по существу равны 0 как ложные и не равны нулю в моем опыте...
Есть ли метод bcl для синтаксического анализа такой строки, а если нет, почему?
Примечание. Я забыл указать в строках "0" и "1". Любопытно, что если уже int int работает, как я и ожидал. Возможно, это вызвало путаницу.
Ответы
Ответ 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;
}