2013-04-25 6 views
16

Ich versuche, den Wert "0" (System.String) in seine Boolean Darstellung zu konvertieren, wie zB:Convert.ToBoolean nicht mit Wert "0"

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

Ich habe am MSDN page sehe, und im Code -sample Block, fand ich diese Zeilen:

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

In meinem Code, ich bin von den System.String-Boolean wie diese Umwandlung:

  • Gibt es eine andere Möglichkeit, um die Art mit nicht so hässlichen Code zu konvertieren?
  • Warum tritt eine solche Ausnahme auf? Wegen der Konvertierung vom Referenztyp System.String in den Werttyp System.Boolean, aber System.Int32 ist auch ein Werttyp, oder?
+1

Das Beispiel zeigt Ihnen, Referenz ist, dass es ungültige Strings, Die ToBoolean() -Methode wird abgelehnt. Zusätzlich zu "0" zeigen sie Beispiele für "TrueString" und "String.Empty". Das Beispiel zeigt, dass diese ungültig sind, nicht dass Sie diese Werte tatsächlich verwenden können. –

+0

Warum nicht var res = "1yestrue" verwenden. Enthält (yourVar)? Es gibt auch Boolean.Parse()/Boolean.TryParse()? – Bernhard

Antwort

47

Dies geschieht, weil Convert.ToBoolean ist eine der folgenden erwartet:

  • "True" (String) = true
  • "False" (String) = false
  • 0 (numerische Typ; int, double, float, etc.) = false
  • Beliebig nicht 0 (numerischer Typ; ...) = true
  • null = false

Alle andere Wert ist ungültig für Boolean.

Sie haben bekam bereits einen sauberen Ansatz:

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

Edit: Sie können eine Erweiterungsmethode erstellen, die einige dieser Fälle für Sie behandeln wird, während das Versteck entfernt Hässlichkeit der Handhabung der Umwandlung.

Diese Erweiterung bietet eine sehr freie Interpretation von Boolean:

  • "True" (String) = true
  • "False" (String) = false
  • "0" (String) = false
  • Jede andere Zeichenfolge = true

Code:

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

Alternativ, wenn Sie einen strengeren Ansatz wollen, das, was erwartet das .NET Framework folgt; dann einfach try/catch Anweisungen verwenden:

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

Wenn auch keine sauber oder ziemlich Ansatz, aber es mehr Möglichkeiten, den richtigen Wert garantiert bekommen. Und die Extensions Klasse ist von Ihrem Daten/Business-Code versteckt.

Am Ende der Conversion-Code ist relativ einfach zu bedienen:

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

versuchen Sie, die "0" in den booleschen Typ zu konvertieren, wie ich im Thema sagte, und schauen Sie sich das msdn-Beispiel an: http://msdn.microsoft.com/en-us/library/86hw82a3.aspx, Sie erhalten ein Exception mit einem Versuch, den Wert "0" Zeichenfolge zu konvertieren. – Secret

+0

Weil '" 0 "' ist * nicht * '" True "' oder '" False "'. Die ** einzige ** Zeichenfolgendarstellung, die akzeptiert wird, ist "True" oder "False". – Jesse

+0

Sie haben erfrischt Sie antworten :) erste Variante davon war anders und halten Sie die "0" in der Liste, so wurde mein Kommentar darauf verwiesen, nicht die aufgefrischt :) auch die sauberste Ansatz sieht hässlich für Code-Stil – Secret

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

Da es ist wirklich eine Frage der immer noch diese Umwandlungen zu tun und so, wie etwa eine Erweiterungsmethode?

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

und so dann würden Sie es wie folgt verwendet werden:

"0".ToBool(); 

und jetzt können Sie leicht diese Methode erweitern noch mehr Fälle zu behandeln, wenn man wollte.

1

Für eine erfolgreiche Umsetzung zu erreichen, muss der Wert Parameter entweder Boolean.TrueString gleich sind, eine Konstante, deren Wert True, Boolean.FalseString, eine Konstante, deren Wert False, oder es muss null sein. Beim Vergleichen von Werten mit Boolean.TrueString und Boolean.FalseString ignoriert die Methode sowohl Groß- als auch Kleinbuchstaben.

von MSDN

weil Convert.ToBoolean erwartet einen true if value is not zero; otherwise, false. Zahlenwert und True oder FalseString Wert.

1

Wenn Sie wissen, dass es ein int wäre, dann können Sie es in int dann zu bool konvertieren. Im Folgenden wird versucht, in bool umzuwandeln, indem die Zeichenfolge versucht wird und dann mit der Nummer versucht wird.

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

Hier ist ein sehr nachsichtig Parser, der von der ersten Zeichentasten aus:

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

schnell genug und einfach:

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