2013-04-25 14 views
16

Sto cercando di convertire il valore "0" (System.String) alla sua Boolean rappresentazione, come:Convert.ToBoolean esito negativo con il valore "0"

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

Ho guardato il MSDN page, e nel codice blocco -Sample, ho trovato queste righe:

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

Nel mio codice, sto convertendo dal System.String-Boolean in questo modo:

  • C'è un altro modo per convertire il tipo Boolean con codice non così brutto?
  • Perché si verifica un'eccezione del genere? A causa della conversione dal tipo di riferimento System.String al tipo di valore System.Boolean, ma anche System.Int32 è un tipo di valore, non è vero?
+1

L'esempio si fa riferimento sta dimostrando che ci sono le stringhe non valide che il metodo ToBoolean() rifiuterà. Oltre a "0", mostrano esempi di "TrueString" e string.Empty. L'esempio mostra che questi non sono validi, non che puoi effettivamente utilizzare quei valori. –

+0

perché non usare var res = "1yestrue" .Contains (yourVar)? Ci sono anche Boolean.Parse()/Boolean.TryParse()? – Bernhard

risposta

47

Ciò accade perché Convert.ToBoolean si aspetta una delle seguenti operazioni:

  • "True" (String) = true
  • "False" (String) = false
  • 0 (tipo numerico; int, double, float, etc.) = false
  • Qualsiasi non- 0 (tipo numerico; ...) = true
  • null = false

Qualsiasi altro valore non è valido per Boolean.

quali hai già ottenuto un pulito approccio:

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

Edit: È possibile creare un metodo di estensione che gestirà alcuni di questi casi per voi, mentre si nascondeva via la la bruttezza di gestire la conversione.

Questa estensione fornisce un'interpretazione molto libera di Boolean:

  • "True" (String) = true
  • "False" (String) = false
  • "0" (String) = false
  • Qualsiasi altra stringa = true

Codice:

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

In alternativa, se si desidera un approccio più rigoroso, che segue quello che il .NET Framework si aspetta; quindi è sufficiente utilizzare try/catch dichiarazioni:

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

Anche se, non un pulito o abbastanza approccio, ma garantisce maggiori possibilità di ottenere il valore corretto. E la classe Extensions è nascosta ai tuoi dati/codice commerciale.

Alla fine, il codice di conversione è relativamente semplice da usare:

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

prova a convertire nel tipo booleano lo "0" come ho detto nell'argomento e guarda l'esempio di msdn su: http://msdn.microsoft.com/en-us/library/86hw82a3.aspx, otterrai un excpetion con un tentativo di convertire il valore di stringa "0". – Secret

+0

Perché '" 0 "' è * non * '" True "' o '" False "'. La ** sola ** rappresentazione di stringhe accettata è '" True "' o '" False "'. – Jesse

+0

che hai aggiornato rispondi :) La prima variante era diversa e conteneva lo "0" nell'elenco, quindi il mio commento è stato riferito ad esso, non quello aggiornato :) anche l'approccio più pulito sembra brutto per lo stile codice – Secret

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

Dal momento che è davvero una questione di ancora fare quelle conversioni e quali, come su di un metodo di estensione?

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

e così allora si può usare in questo modo:

"0".ToBool(); 

e ora si potrebbe facilmente estendere questo metodo per gestire anche più casi se si voleva.

1

Per una conversione avvenga, il parametro valore deve essere uguale o Boolean.TrueString, una costante il cui valore è True, Boolean.FalseString, una costante il cui valore è False, oppure deve essere nullo. Nel confrontare il valore con Boolean.TrueString e Boolean.FalseString, il metodo ignora il caso e lo spazio bianco iniziale e finale.

da MSDN

perché Convert.ToBoolean aspetta un valore numerico true if value is not zero; otherwise, false. e True o FalseString valore.

1

Se sai che sarebbe un int allora puoi convertirlo in int e poi in bool. In seguito proverà a convertire in bool tentando la stringa e tentando con il numero.

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

Ecco un parser molto indulgente che le chiavi al largo del primo carattere:

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

abbastanza veloce e semplice:

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