Culture invariant décimal.TryParse()

j'écris une chaîne de caractères personnalisée à validateur décimal qui doit utiliser la décimale.TryParse qui ignore la culture (i.e. ne se soucie pas si l'entrée contient "."ou "," comme séparateur décimal point de séparateur). C'est la méthode suggérée:

public static bool TryParse(
    string s,
    NumberStyles style,
    IFormatProvider provider,
    out decimal result
)

Je ne sais pas quoi utiliser comme troisième paramètre. Les exemples que j'ai vus ressemblent à ceci:

culture = CultureInfo.CreateSpecificCulture("en-GB");
Decimal.TryParse(value, style, culture, out number)

donc ils créent une culture spécifique. CultureInfo n'a pas de méthode "CreateInvariantCulture", et CultureInfo.La culture invariante n'est pas du type requis. Quelle est l'utilisation correcte?

23
demandé sur Soner Gönül 2014-04-17 15:03:10

4 réponses

Avoir essayer comme ceci :

decimal value;
bool b = Decimal.TryParse("0.1", NumberStyles.Any, new CultureInfo("en-US"), out value);

la meilleure façon serait probablement d'utiliser la décimale.Parse () méthode comme vous le feriez traditionnellement avec n'importe quelles valeurs de chaîne décimale.

vous pouvez utiliser des Numérotstyles.Devise pour spécifier que les valeurs doivent être lues en tant que Devise, ce qui prendra soin de toutes les valeurs liées à la devise (vous aurez besoin d'ajouter une référence au système.Globalalization à utiliser ceci :

using System.Globalization;

Décimal.Analyser accepte également un troisième paramètre, ce qui permettra à vous de définir explicitement le IFormatProvider si vous le souhaitez et vous souhaite une Culture spécifique :

decimal value = Decimal.Parse(currency, NumberStyles.Currency, CultureInfo.InvariantCulture); //yields 15.55
39
répondu Nayeem Mansoori 2014-04-17 11:05:35

Mon mauvais gars. J'ai testé le code suivant:

        string DutchDecimal = "1,5";
        string EnglishDecimal = "1.5";
        decimal a;
        decimal b;
        Console.WriteLine(decimal.TryParse(DutchDecimal, out a));
        Console.WriteLine(a);
        Console.WriteLine(decimal.TryParse(EnglishDecimal, out b));
        Console.WriteLine(b);
        Console.Read();

et il analyse correctement les deux chaînes. Il semble que le TryParse par défaut est en effet invariant de culture. J'ai supposé que ce n'était pas le cas, parce que le TypeConversionValidator par défaut dans L'entreprise était dépendant de la culture et j'ai supposé Qu'il utilisait simplement TryParse. Cependant, comme il s'avère que cet analyseur par défaut est hardcodé pour utiliser la culture courante.

EDIT: j'ai trouvé que "1.5" convertit à 1,5 et "1,5" convertit à 15. Ceci est en fait correct pour le comportement invariant de culture, donc il est là. Toute cette question a apparemment été engendrée par mon incompréhension de la façon dont la culture invariant fonctionne.

6
répondu Shaggydog 2014-04-17 13:04:22

En fait CultureInfo.InvariantCulture peut être utilisé ici. Le paramètre attend IFormatProvider, une interface CultureInfo met en œuvre. Mais InvariantCulture est invariante dans le sens qu'elle ne varie pas avec les paramètres de l'utilisateur.

En fait, il n'y a pas de culture qui accepte , ou . comme séparateur décimal – ils sont tous un ou l'autre. Vous devrez trouver un autre moyen de traiter les données qui peuvent utiliser l'un ou l'autre de ces séparateurs décimaux.

2
répondu David Heffernan 2014-04-17 11:05:55

Je ne sais pas quoi utiliser comme troisième paramètre.

parce que toutes les cultures NumberDecimalSeparator ou NumberGroupSeparator etc.. ne sont pas les mêmes.

Quelqu'un utilise .NumberDecimalSeparator, quelqu'un utilise , mais il n'y a pas de CultureInfo qui utilise les deux comme un NumberDecimalSeparator.

CultureInfo implémente IFormatProvider interface. C'est pourquoi, si vous spécifiez CultureInfo, le value chaîne essayez d'être analysé sur que les cultures règles.

j'écris une chaîne personnalisée à un validateur décimal qui doit être utilisé Décimal.TryParse qui ne tient pas compte de la culture

Dans ce cas, vous pouvez utiliser CultureInfo.Clone méthode pour copier de la culture que vous voulez (ou InvariantCulture) et vous pouvez définir NumberDecimalSeparator et NumberGroupSeparator quelle chaîne vous voulez.

1
répondu Soner Gönül 2014-04-17 11:19:34