J'ai une chaîne de texte comme ceci:
var foo = "FooBar";
Je veux déclarer une deuxième chaîne appelée bar
et la rendre égale au premier et au quatrième caractère de mon premier foo
, donc je fais ceci comme ceci:
var bar = foo[0].ToString() + foo[3].ToString();
Cela fonctionne comme prévu, mais ReSharper me conseille de mettre Culture.InvariantCulture
entre mes crochets, donc cette ligne se termine comme suit:
var bar = foo[0].ToString(CultureInfo.InvariantCulture)
+ foo[3].ToString(CultureInfo.InvariantCulture);
Qu'est-ce que cela signifie et affectera-t-il le fonctionnement de mon programme?
Réponses:
Toutes les cultures n'utilisent pas le même format pour les dates et les valeurs décimales / monétaires.
Ce sera important pour vous lorsque vous êtes en train de convertir des valeurs d'entrée (de lecture) qui sont stockés sous forme de chaînes à
DateTime
,float
,double
oudecimal
. Cela importera également si vous essayez de formater les types de données susmentionnés en chaînes (écriture) pour l'affichage ou le stockage.Si vous savez à l'avance dans quelle culture spécifique vos dates et vos valeurs décimales / monétaires se trouveront, vous pouvez utiliser cette
CultureInfo
propriété spécifique (c'est-à-direCultureInfo("en-GB")
). Par exemple, si vous attendez une entrée utilisateur.La
CultureInfo.InvariantCulture
propriété est utilisée si vous formatez ou analysez une chaîne qui doit être analysable par un logiciel indépendant des paramètres locaux de l'utilisateur.La valeur par défaut est
CultureInfo.InstalledUICulture
donc le CultureInfo par défaut dépend des paramètres du système d'exploitation en cours d'exécution. C'est pourquoi vous devez toujours vous assurer que les informations sur la culture correspondent à votre intention (voir la réponse de Martin pour une bonne ligne directrice).la source
en-US
. C'est la culture locale. EtInvariantCulture
est utilisé lorsque vous souhaitez une mise en forme neutre de la culture, indépendante du système local. Par exemple, lorsque vous travaillez avec des formats de fichiers basés sur du texte.Lorsque les nombres, les dates et les heures sont formatés en chaînes ou analysés à partir de chaînes, une culture est utilisée pour déterminer comment cela est fait. Par exemple, dans la
en-US
culture dominante , vous avez ces représentations sous forme de chaîne:Dans ma culture (
da-DK
), les valeurs ont cette représentation sous forme de chaîne:Dans le système d'exploitation Windows, l'utilisateur peut même personnaliser le formatage des nombres et des dates / heures et peut également choisir une autre culture que la culture de son système d'exploitation. La mise en forme utilisée est le choix de l'utilisateur qui doit être ainsi.
Ainsi, lorsque vous formatez une valeur à afficher pour l'utilisateur en utilisant par exemple
ToString
ouString.Format
ou analysée à partir d'une chaîne en utilisantDateTime.Parse
ou,Decimal.Parse
la valeur par défaut est d'utiliser leCultureInfo.CurrentCulture
. Cela permet à l'utilisateur de contrôler le formatage.Cependant, une grande partie du formatage et de l'analyse des chaînes ne sont en fait pas des chaînes échangées entre l'application et l'utilisateur mais entre l'application et certains formats de données (par exemple un fichier XML ou CSV). Dans ce cas, vous ne souhaitez pas utiliser,
CultureInfo.CurrentCulture
car si le formatage et l'analyse sont effectués avec des cultures différentes, ils peuvent être interrompus. Dans ce cas, vous souhaitez utiliserCultureInfo.InvariantCulture
(qui est basé sur laen-US
culture). Cela garantit que les valeurs peuvent aller-retour sans problème.La raison pour laquelle ReSharper vous avertit est que certains auteurs d'applications ne sont pas conscients de cette distinction qui peut conduire à des résultats inattendus, mais ils ne le découvrent jamais car leur
CultureInfo.CurrentCulture
esten-US
qui a le même comportement queCultureInfo.InvariantCulture
. Cependant, dès que l'application est utilisée dans une autre culture où il est possible d'utiliser une culture pour la mise en forme et une autre pour l'analyse, l'application peut être interrompue.Donc pour résumer:
CultureInfo.CurrentCulture
(valeur par défaut) si vous formatez ou analysez une chaîne utilisateur.CultureInfo.InvariantCulture
si vous formatez ou analysez une chaîne qui doit être analysable par un logiciel.la source
Decimal
variable contenant une certaine valeur en dollars américains, est-ce que je voudrais faire une exception et l'utiliseren-US
comme culture lors de son affichage pour m'assurer de ne pas obtenir un résultat qui ressemble à un nombre en euros? J'ai essayéCultureInfo.InvariantCulture
, mais j'ai obtenu ceci pour le marqueur de devise¤
, donc je ne suis pas sûr que ce soit la bonne façon.CultureInfo.CurrentCulture
). Si, en plus d'afficher un nombre, vous avez besoin de la devise, vous devriez peut-être le faire de manière cohérente, c'est-à-dire ne pas utiliser deCultureInfo
et utiliser à la place le code de devise à trois lettres commeUSD 1,234.56
. Ensuite, vous n'entrez pas dans les problèmes de mappage d'une monnaie à une culture.Selon Microsoft:
(à partir de http://msdn.microsoft.com/en-us/library/4c5zdc6a(vs.71).aspx )
Donc InvariantCulture est similaire à la culture "en-US" mais pas exactement la même chose. Si vous écrivez:
alors s1 et s2 auront un format similaire mais InvariantCulture ajoute des zéros non significatifs et "en-US" utilise AM ou PM.
Donc InvariantCulture est meilleur pour un usage interne, lorsque vous enregistrez par exemple une date dans un fichier texte ou analysez des données. Et un CultureInfo spécifié est meilleur lorsque vous présentez des données (date, devise ...) à l'utilisateur final.
la source
Pour des choses comme les nombres (points décimaux, virgules dans les montants), ils sont généralement préférés dans la culture spécifique.
Une manière appropriée de le faire serait de le définir au niveau de la culture (pour l'allemand) comme ceci:
la source
JetBrains offre une explication raisonnable ,
mais si je travaille sur un site dont je sais qu'il sera en anglais uniquement, j'ignore simplement la suggestion.
la source