web-dev-qa-db-fra.com

Comment définir CultureInfo.InvariantCulture par défaut?

Quand j'ai un tel morceau de code en C #:

double a = 0.003;
Console.WriteLine(a);

Il imprime "0,003".

Si j'ai un autre morceau de code:

double a = 0.003;
Console.WriteLine(a.ToString(CultureInfo.InvariantCulture));

Il imprime "0.003".

Mon problème est que j'ai besoin d'un point comme marque décimale, mais C # crée une virgule par défaut. En outre, je ne veux pas taper une aussi longue ligne de code uniquement pour imprimer une double variable.

18
nhtrnm

Vous pouvez définir la culture du fil actuel sur la culture de votre choix:

Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture;

Notez que la modification de la culture affecte également des choses comme la comparaison et le tri de chaînes, les formats de date et l'analyse de dates et de nombres.

31
Guffa

1 Chaîne vide spécifie InvariantCulture dans config.file

Par défaut, Culture et UICulture sont réglés sur "" dans la configuration.

   <system.web>
      <globalization culture="" />
   </system.web>

2 Vous pouvez également définir sur votre Thread

5
Aghilas Yakoub

Depuis .NET Framework version 4.5 (et .NET Core/Standard 1.0), vous pouvez modifier la culture de l'ensemble du domaine d'application, plutôt que simplement du thread actuel, en modifiant les propriétés CultureInfo.DefaultThreadCurrentCulture et CultureInfo.DefaultThreadCurrentUICulture Propriétés:

CultureInfo.DefaultThreadCurrentCulture = CultureInfo.InvariantCulture;
CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.InvariantCulture;
3
Martin Valgur

C # n'en fait pas une virgule par défaut, c'est votre culture. Essayez de définir la culture de manière explicite, 

System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");

Lien: http://msdn.Microsoft.com/en-us/library/ms425914(v=office.12).aspx

3
Ash Burlaczenko

Vous pouvez définir CultureInfo.InvariantCulture comme valeur par défaut, comme indiqué ci-dessus par @Guffa et les autres.

Mais vous devez avoir une idée claire de la raison pour laquelle vous faites cela. Tout ira bien si vous effectuez des opérations d'exportation/importation de données, mais vous ne l'utiliserez probablement pas pour les chaînes présentées à l'utilisateur.

La documentation de Microsoft indique:

La culture invariante est insensible à la culture; il est associé à la langue anglaise mais pas avec n'importe quel pays/région. Vous spécifiez le culture invariante par son nom en utilisant une chaîne vide ("") dans l'appel à une méthode d'instanciation CultureInfo. ... 

Contrairement aux données sensibles à la culture, qui est sujet à changement par la personnalisation de l'utilisateur ou par les mises à jour du fichier .NET Framework ou le système d’exploitation, les données de culture invariantes sont stable dans le temps et entre les cultures installées et ne peut pas être personnalisé par les utilisateurs. Cela rend la culture invariante particulièrement utile pour les opérations qui nécessitent des résultats indépendants de la culture, tels que comme des opérations de formatage et d’analyse qui persistent des données formatées, ou les opérations de tri et de classement nécessitant l'affichage de données dans un ordre fixe indépendamment de la culture.

1
Designpattern

Si vous jamais souhaitez un formatage de nombres et de dates spécifique à une culture, vous pouvez définir la culture une fois, par exemple au démarrage de l'application.

Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture

S'il s'agit d'une application ASP.NET, une alternative plus simple consiste à définir la culture dans l'élément de configuration <globalization> de web.config.

Sinon, vous n'avez pas beaucoup d'alternative à spécifier explicitement la culture. Si vous vous retrouvez à taper de manière répétitive la même longue ligne de code, faites ce que vous faites toujours dans ce cas: enroulez-le dans une méthode.

1
Joe

Quand vous appelez WriteLine() et donnez un double, il fait plus ou moins en interne cet appel:

Console.WriteLine(a.ToString(CultureInfo.CurrentCulture));

La tâche serait maintenant de remplacer CurrentCulture par InvariantCulture. Cela peut être fait par la ligne de code suivante:

Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;

Maintenant, votre thread est défini sur la culture Invariant et votre premier appel doit également afficher "0.003".

1
Oliver