85 votes

Convert.ToBoolean et Boolean.Parse n'acceptent pas 0 et 1.

Pourquoi a-t-il été décidé que lors de l'analyse d'un booléen, les 0/1 ne sont pas acceptables ?

Lors de l'analyse de toute valeur de type entier, il accepte les chaînes numériques à analyser. (Et si .NET peut analyser la chaîne "Cent millions deux cent soixante-cinq mille huit cent soixante-cinq", je serais surpris).

Qu'est-ce qui rend les booléens spéciaux ? Ils sont essentiellement 0 comme faux, et non-zéro comme vrai dans mon expérience...

Existe-t-il une méthode bcl pour analyser une chaîne de caractères comme celle-ci, et si non, pourquoi ?

Note : J'ai oublié de spécifier dans une chaîne de caractères "0" et "1". Curieux cependant que si c'est déjà un int, cela fonctionne comme je l'avais prévu. Peut-être est-ce la cause de la confusion.

85voto

Aric TenEyck Points 5434

0 et (non-zéro) ne sont pas égaux à "faux" et "vrai", c'est juste la représentation choisie par le C. D'autres langages utilisent 0 pour vrai et -1 pour faux, ou d'autres schémas entièrement différents. Un booléen est pas un 0 ou un 1, c'est un vrai ou un faux.

Doit-il également gérer les mots "oui" et "non", "off" et "on", et toutes les myriades d'autres choses qui sont analogues aux booléens ? Où faut-il tracer la ligne ?

3 votes

Merci ! C'est ce que je cherchais, une explication du pourquoi. Si certains langages utilisent effectivement 0 pour vrai, et -1 pour faux, je pense honnêtement qu'ils sont détraqués, mais c'est une excellente raison de ne pas supposer automatiquement par une analyse que certains développeurs peuvent utiliser aveuglément.

90 votes

Pourquoi, oui. Oui, il devrait gérer le oui/non off/on.

3 votes

Pour expliquer davantage pourquoi certaines langues utilisent 0 pour vrai et -1 pour faux, considérez leurs représentations binaires : 00000000 y 11111111 .

36voto

Anon. Points 26829

Qu'est-ce qui rend les booléens spéciaux ? Ils sont essentiellement 0 comme faux, et non-zéro comme vrai dans mon expérience...

Il s'agit d'un détail de mise en œuvre, qui n'est pas du tout pertinent.

true est une valeur booléenne. false est une valeur booléenne. Tout le reste ne l'est pas.

Si vous voulez analyser quelque chose de telle sorte que la chaîne "0" soit évaluée false tandis que tout le reste évalue true vous pouvez l'utiliser :

!mystr.Equals("0");

0 votes

Belle solution concise, j'aime bien !

10 votes

Et la chaîne "true" et la chaîne "false" sont des chaînes de caractères, pas des booléens. Pourtant, personne ne semble avoir de problème à reconnaître leur signification lorsqu'elles sont converties en booléens. Si nous sommes assez intelligents pour reconnaître que "true" signifie vrai, je pense que nous sommes assez intelligents pour reconnaître que "1" et 1 signifient vrai également. Et nous sommes suffisamment intelligents pour reconnaître que "on" et "yes" sont des affirmations qui peuvent également être converties sans risque en vrai si le programmeur demande spécifiquement une conversion

22voto

Visual Micro Points 683

Le partage FormatHelper présentée ci-dessous fournit une solution simple en utilisant deux variantes d'une méthode surchargée appelée StringToBoolean .

FormatHelper.StringToBoolean(String value)
FormatHelper.StringToBoolean(String value, Boolean NullOrEmptyDefault)

Les deux variantes prévoient une correspondance entre les chaînes de caractères et les cas.

1) La conversion normale d'une chaîne de caractères en un booléen, en attribuant par défaut aux chaînes vides ou nulles la valeur suivante false

Les exemples suivants donnent lieu à un boolean valeur de 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");

Toute autre valeur de chaîne donnera lieu à un Boolean valeur de true tels que:-

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

Note : Modifier la valeur de BooleanStringOff dans la classe ci-dessous pour inclure plus (ou moins) de valeurs pour false/off

2) Suit les mêmes règles que 1) ci-dessus mais permet une valeur par défaut de true à fournir comme deuxième argument de la conversion.

La valeur par défaut est utilisée lorsque le String est vide ou null . Ceci est utile si une valeur de chaîne manquante doit signifier une true l'État.

L'exemple de code suivant renverra true

 Boolean myBool = FormatHelper.StringToBoolean("",true);

L'exemple de code suivant renverra false

 Boolean myBool = FormatHelper.StringToBoolean("false",true);

C'est le code pour le FormatHelper classe

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

1 votes

J'ai mis à jour cette méthode pour C# 7 et plus comme une méthode d'extension avec des valeurs par défaut : gist.github.com/jamiehowarth0/5587d7d3731d58b10e0559c6e0efb4‌​e1

10voto

Josh Points 38617

Malheureusement, cela arrive souvent en .NET. Par exemple, je ne me souviens plus s'il s'agit de XML Serializer ou de XmlConvert, mais l'un d'eux échoue si la casse de True/False n'est pas correcte.

Vous pouvez faire un aller-retour à travers les entiers pour obtenir ce que vous voulez.

string s = "2";
int i = Convert.ToInt32(s);
bool b = Convert.ToBoolean(i);

Dans le cas ci-dessus, tout ce qui est différent de zéro sera évalué comme vrai.

Pour cette raison, j'ai créé une classe que j'utilise partout, appelée ConversionStrategy, qui prend en compte le type de source et le type de destination et choisit la stratégie de conversion la plus idéale (et la plus souple) pour effectuer la conversion.

2 votes

La réponse acceptée semble bonne en théorie, mais quand vous voyez des choses comme ça, il n'y a vraiment aucune rationalisation qui puisse donner un sens à tout cela.

0 votes

Solution plus rapide

5voto

Que pensez-vous de ça ?

  byte i = 1; //or 0
  bool myBool = BitConverter.ToBoolean(new byte[] { i }, 0)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X