Convert.ToBoolean с ошибкой "0"
Я пытаюсь преобразовать значение "0"
(System.String
) в его представление Boolean
, например:
var myValue = Convert.ToBoolean("0"); // throwing an exception here
Я просмотрел страницу MSDN, и в блоке code-sample я нашел следующие строки:
ConvertToBoolean("0");
// ...
Unable to convert '0' to a Boolean.
В моем коде я конвертирую с System.String
в Boolean
следующим образом:
// will be OK, but ugly code
var myValue = Convert.ToBoolean(Convert.ToInt32("0"));
- Есть ли другой способ преобразования в тип
Boolean
с не таким уродливым кодом?
- Почему возникает такое исключение? Из-за преобразования из ссылочного типа
System.String
в тип значения System.Boolean
, но System.Int32
также является типом значения, не так ли?
Ответы
Ответ 1
Это происходит потому, что Convert.ToBoolean
ожидает одно из следующих действий:
Любое другое значение недействительно для Boolean
.
У вас уже есть чистый подход:
var myValue = Convert.ToBoolean(Convert.ToInt32("0"));
Изменить:. Вы можете создать метод расширения, который будет обрабатывать некоторые из этих случаев для вас, и скрыть уродство обработки преобразования.
Это расширение обеспечивает очень свободную интерпретацию Boolean
:
-
"True"
(String) = true
-
"False"
(String) = false
-
"0"
(String) = false
- Любая другая строка =
true
код:
public static class Extensions
{
public static Boolean ToBoolean(this string str)
{
String cleanValue = (str ?? "").Trim();
if (String.Equals(cleanValue, "False", StringComparison.OrdinalIgnoreCase))
return false;
return
(String.Equals(cleanValue, "True", StringComparison.OrdinalIgnoreCase)) ||
(cleanValue != "0");
}
}
В качестве альтернативы, если вам нужен более строгий подход, который следует за тем, что ожидает .NET Framework; затем просто используйте инструкции try/catch
:
public static class Extensions
{
public static Boolean ToBoolean(this string str)
{
try
{
return Convert.ToBoolean(str);
}
catch { }
try
{
return Convert.ToBoolean(Convert.ToInt32(str));
}
catch { }
return false;
}
}
Хотя это не чистый или симпатичный подход, но он гарантирует больше возможностей для получения правильного значения. И класс Extensions
спрятан от вашего кода данных/бизнеса.
В конце код конверсии относительно прост в использовании:
String myString = "1";
Boolean myBoolean = myString.ToBoolean();
Ответ 2
public static class BooleanParser
{
public static bool SafeParse(string value)
{
var s = (value ?? "").Trim().ToLower();
return s == "true" || s == "1";
}
}
Ответ 3
Так как это действительно вопрос о том, чтобы делать эти преобразования и т.д., как насчет метода расширения?
public static class Extensions {
public static bool ToBool(this string s) {
return s == "0" ? false : true;
}
}
и тогда вы будете использовать его следующим образом:
"0".ToBool();
и теперь вы можете легко расширить этот метод, чтобы обрабатывать еще больше случаев, если хотите.
Ответ 4
Для успешной конверсии параметр значения должен быть равен Boolean.TrueString
, константа, значение которой True
, Boolean.FalseString
, константа, значение которой False
, или оно должно быть нулевым. При сравнении значения с Boolean.TrueString и Boolean.FalseString, метод игнорирует регистр, а также пробелы в начале и конце.
из MSDN
потому что Convert.ToBoolean
ожидает true, если значение не равно нулю; в противном случае значение false. и True
или False
String
.
Ответ 5
Если вы знаете, что это будет int, вы можете преобразовать его в int, а затем в bool. Следующее попытается выполнить преобразование в bool, попробовав строку, затем попытавшись с номером.
public bool ToBoolean(string value)
{
var boolValue = false;
if (bool.TryParse(value, out boolValue ))
{
return boolValue;
}
var number = 0;
int.TryParse(value, out number))
return Convert.ToBoolean(number);
}
Ответ 6
Быстро и просто:
public static class Extensions
{
static private List<string> trueSet = new List<string> { "true","1","yes","y" };
public static Boolean ToBoolean(this string str)
{
try
{ return trueSet.Contains(str.ToLower()); }
catch { return false; }
}
}
Ответ 7
Здесь очень прощающий парсер, который отбрасывает первый символ:
public static class StringHelpers
{
/// <summary>
/// Convert string to boolean, in a forgiving way.
/// </summary>
/// <param name="stringVal">String that should either be "True", "False", "Yes", "No", "T", "F", "Y", "N", "1", "0"</param>
/// <returns>If the trimmed string is any of the legal values that can be construed as "true", it returns true; False otherwise;</returns>
public static bool ToBoolFuzzy(this string stringVal)
{
string normalizedString = (stringVal?.Trim() ?? "false").ToLowerInvariant();
bool result = (normalizedString.StartsWith("y")
|| normalizedString.StartsWith("t")
|| normalizedString.StartsWith("1"));
return result;
}
}