2013-04-25 21 views
16

Próbuję przekonwertować wartość "0" (System.String) do jego Boolean reprezentacji, jak:Convert.ToBoolean nie powiedzie się z „0” wartości

var myValue = Convert.ToBoolean("0"); // throwing an exception here 

Szukałem na MSDN page, a w kodzie -sample blok, znalazłem te linie:

ConvertToBoolean("0"); 
// ... 
Unable to convert '0' to a Boolean. 

W moim kodu, mam konwersji z System.String do Boolean tak:

// will be OK, but ugly code 
var myValue = Convert.ToBoolean(Convert.ToInt32("0")); 
  • Czy istnieje inny sposób konwersji na typ Boolean bez takiego paskudnego kodu?
  • Dlaczego występuje taki wyjątek? Z powodu konwersji z typu odniesienia System.String na typ wartości System.Boolean, ale System.Int32 jest również typem wartości, nieprawdaż?
+1

Przykład odwołać się pokazując, że są nieprawidłowe ciągi metoda ToBoolean() odrzuci. Oprócz "0", pokazują przykłady "TrueString" i string.Empty. Próbka pokazuje, że są one nieważne, a nie, że możesz faktycznie użyć tych wartości. –

+0

dlaczego nie używać var ​​res = "1yestrue" .Contains (yourVar)? Istnieją również Boolean.Parse()/Boolean.TryParse()? – Bernhard

Odpowiedz

47

Dzieje się tak dlatego, Convert.ToBoolean spodziewa się jedną z następujących czynności:

Każda inna wartość jest nieprawidłowy Boolean.

pan już dostał czystą podejście:

var myValue = Convert.ToBoolean(Convert.ToInt32("0")); 

Edit: Można utworzyć metodę rozszerzenia, które będą obsługiwać kilka z tych przypadków dla Ciebie, podczas ukrywania się z dala brzydota obsługi konwersji.

To rozszerzenie zapewnia bardzo luźną interpretację Boolean:

  • "True" (String) = true
  • "False" (String) = false
  • "0" (String) = false
  • Wszelkie inne ciąg = true

Kod:

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

Ewentualnie, jeśli chcesz bardziej rygorystyczne podejście, które towarzyszą co .NET Framework oczekuje; następnie wystarczy użyć try/catch oświadczenia:

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

Choć nie całkiem podejście czysty lub , ale gwarantuje większe możliwości na uzyskanie prawidłowej wartości. Klasa Extensions jest ukryta przed kodem danych/firmy.

W końcu kod konwersji jest stosunkowo prosty w obsłudze:

String myString = "1"; 
Boolean myBoolean = myString.ToBoolean(); 
+0

spróbuj przekonwertować na Boolean wpisz "0", jak powiedziałem w temacie i spójrz na próbkę msdn na: http://msdn.microsoft.com/en-us/library/86hw82a3.aspx, dostaniesz excpetion z próbą przekonwertowania wartości ciągu "0". – Secret

+0

Ponieważ '" 0 "' to * nie * '" Prawda "' lub '" Fałsz "'. Dopuszczalna tylko ** reprezentacja ciągów znaków to '" True "' lub '" False "'. – Jesse

+0

odświeżyłeś odpowiedź :) Pierwszy wariant był inny i przytrzymaj "0" na liście, więc mój komentarz został do niego odwołany, a nie odświeżony :) również najczystsze podejście wygląda brzydko dla stylu kodu – Secret

5
public static class BooleanParser 
{ 
    public static bool SafeParse(string value) 
    { 
     var s = (value ?? "").Trim().ToLower(); 
     return s == "true" || s == "1"; 
    } 
} 
3

Ponieważ jest to naprawdę kwestia wciąż robi te konwersje i takie, jak o metodę rozszerzenia?

public static class Extensions { 
    public static bool ToBool(this string s) { 
     return s == "0" ? false : true; 
    } 
} 

a więc wtedy można go używać tak:

"0".ToBool(); 

i teraz można łatwo rozszerzyć tę metodę do obsługi nawet więcej przypadków, jeśli chciał.

1

Aby skuteczne przekształcenie występuje parametr wartość musi być równa albo Boolean.TrueString, stałą, której wartość jest True, Boolean.FalseString się stałą, której wartość jest False lub musi być zerowa. Porównując wartość z Boolean.TrueString i Boolean.FalseString, metoda ignoruje wielkość liter oraz końcowe i końcowe białe znaki.

z MSDN

ponieważ Convert.ToBoolean oczekuje true if value is not zero; otherwise, false. wartość liczbową i True lub FalseString wartość.

1

Jeśli wiesz, że byłby to int, możesz przekształcić go na int, a następnie na bool. Poniżej spróbuję konwersji na wartość bool, próbując napisu, a następnie próbując z numerem.

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

Oto bardzo wyrozumiały parser że klucze off z pierwszego znaku:

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; 
    } 
} 
1

wystarczająco szybki i prosty:

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