71 votes

Int32.ToString () est-il spécifique à la culture?

Je suis en cours d'exécution d'une version bêta de ReSharper, et c'est de me donner des avertissements pour le code suivant:

int id;
// ...
DoSomethingWith(id.ToString());

L'avertissement est sur le id.ToString() appel, et il me dit "Spécifier une culture au sein de la chaîne de conversion explicitement". Je comprends l'avertissement, et je sais comment résoudre le problème -- il suffit de changer le code pour le beaucoup plus compliqué id.ToString(CultureInfo.InvariantCulture).

Mais ma question est: est-ce nécessaire? Je veux dire, évidemment, il est important de spécifier la culture lorsque vous utilisez des types comme DateTime (différentes cultures ont différents formats de date) et Double (différents caractères utilisés pour le point décimal). Mais Int32.ToString(), au moins dans l'en-US et de l'invariant de cultures, de ne pas ajouter de mise en forme à tous. Pas de virgule, pas de décimales, pas de signes dollar, rien. Alors, qu'aurait-il à varier en fonction de la culture?

Certaines cultures qui en fait ajouter une sorte de mise en forme lorsque vous appelez la sans paramètre Int32.ToString()? Ou est-ce un bug dans le ReSharper bêta, et cet avertissement n'est pas vraiment applicable à l' Int32 (dans ce cas, je vais déposer une ReSharper rapport de bug)?

74voto

Daniel Peñalba Points 8548

Le système d'exploitation permet de changer le signe négatif pour les nombres.

 Control panel -> 
   Language and regional settings -> 
         Additional settings -> 
             Negative sign
 

Ainsi, la culture actuelle aurait pu remplacer le signe négatif. Dans ce cas, vous devez respecter les paramètres régionaux, c’est la raison de l’avertissement. Vous pouvez également modifier le signe négatif par programme:

     CultureInfo culture = Thread.CurrentThread.CurrentCulture;
    // Make a writable clone
    culture = (CultureInfo) culture.Clone();
    culture.NumberFormat.NegativeSign = "!";
 

31voto

Colonel Panic Points 18390

Comme testé sur un échantillon aléatoire d'ints, les 352 cultures installées avec Windows ( CultureTypes.InstalledWin32Cultures ) donnent des résultats identiques.

Daniel a raison de noter qu'une culture personnalisée pourrait utiliser un préfixe différent pour les nombres négatifs, mais je doute que quelqu'un ait déjà utilisé cette fonctionnalité, sauf par accident.

Je suppose que les développeurs .NET l'ont fait pour être cohérent avec float et d'autres types. À quoi d'autre s'attendaient-ils?

 > int.MaxValue.ToString(CultureInfo.AncientRome)
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM....
 

3voto

Jeff Mercado Points 42075

Oui. Il dépend de la culture actuelle. À partir de la MSDN docs:

La valeur de retour est formaté avec le général numérique spécificateur de format ("G") et l'objet NumberFormatInfo pour la culture actuelle.

c'est moi qui souligne

Resharper juste plus probable veut que vous soyez explicite sur ce que la culture vous avez l'intention d'utiliser. Depuis omettant il s'appuie sur un comportement qui peut changer une fois exécutées sur des machines différentes.

0voto

ChrisBD Points 5795

J'aurais dit non, mais en vérifiant MSDN Int32.ToString (), il y a ceci:

La valeur de retour est mise en forme avec le spécificateur de format numérique général ("G") et l'objet NumberFormatInfo pour la culture actuelle.

Donc, il y a une surprise.

La question devrait être pourquoi le resharper actuel ne suggère-t-il pas cela?

-4voto

lorddev Points 1459

Parce que les entiers peuvent être aussi élevés que 2.147.483.647.

Dans certains pays , ils utilisent des décimales ou un espace à la place des virgules.

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