web-dev-qa-db-fra.com

Comment formater génériquement un booléen en une chaîne Oui / Non?

Je voudrais afficher Oui/Non dans différentes langues selon une variable booléenne.
Existe-t-il un moyen générique de le formater en fonction des paramètres régionaux qui lui sont transmis?
S'il n'y en a pas, quelle est la façon standard de formater un booléen en plus de boolVar ? Resources.Yes : Resources.No.
Je suppose que boolVar.ToString(IFormatProvider) est impliquée.
Mon hypothèse est-elle correcte?

43
the_drow

Le cadre lui-même ne vous fournit pas cela (pour autant que je sache). Traduction en cours true/false en yes/no ne me semble pas plus courant que d'autres traductions potentielles (telles que on/off, checked/unchecked, read-only/read-write ou peu importe).

J'imagine que la façon la plus simple d'encapsuler le comportement est de créer une méthode d'extension qui encapsule la construction que vous vous proposez dans votre question:

public static class BooleanExtensions
{
    public static string ToYesNoString(this bool value)
    {
        return value ? Resources.Yes : Resources.No;
    }
}

Usage:

bool someValue = GetSomeValue();
Console.WriteLine(someValue.ToYesNoString());
60
Fredrik Mörk

Comme les autres réponses l'indiquent, le framework ne permet pas aux valeurs booléennes d'avoir des formateurs personnalisés. Cependant, cela permet aux nombres d'avoir des formats personnalisés. La méthode GetHashCode sur le booléen renverra 1 pour vrai et 0 pour faux.

Selon chaînes de format numérique personnalisé MSDN , lorsqu'il y a 3 sections de ";" le format spécifié sera appliqué aux "nombres positifs; nombres négatifs; zéro".

La méthode GetHashCode peut être appelée sur la valeur bool pour renvoyer un nombre afin que vous puissiez utiliser la chaîne de format numérique personnalisé pour renvoyer Oui/Non ou Activé/Désactivé ou tout autre ensemble de mots que la situation appelle.

Voici un exemple qui revient sur/OFF:

var truth   = string.Format("{0:on;0;OFF}", true.GetHashCode());
var unTruth = string.Format("{0:on;0;OFF}", false.GetHashCode());

résultats:

truth   = on
unTruth = OFF
43
jhamm

Malheureusement, Boolean.ToString (IFormatProvider) n'aide pas ici:

Le paramètre du fournisseur est réservé. Il ne participe pas à l'exécution de cette méthode. Cela signifie que la méthode Boolean.ToString (IFormatProvider), contrairement à la plupart des méthodes avec un paramètre de fournisseur , ne reflète pas les paramètres spécifiques à la culture.

Dans tous les cas, les booléens représentent Vrai et Faux, pas Oui et Non. Si vous voulez mapper Vrai -> Oui et Faux -> Non, vous devrez le faire (y compris la localisation) vous-même; il n'y a pas de support intégré dans le cadre pour cela. Votre solution proposée (Ressources.Oui/Non) me convient parfaitement.

11
Heinzi