web-dev-qa-db-fra.com

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

J'utilise une version bêta de ReSharper, et cela me donne des avertissements pour le code suivant:

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

L'avertissement est sur l'appel id.ToString(), et il me dit "Spécifiez une culture dans la conversion de chaîne explicitement". Je comprends l'avertissement et je sais comment le corriger - changez simplement le code en id.ToString(CultureInfo.InvariantCulture) beaucoup plus lourd.

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 des formats de date différents) et Double (différents caractères utilisés pour la virgule décimale). Mais Int32.ToString(), au moins dans les cultures en-US et invariantes, n'ajoute aucun formatage du tout. Pas de virgules, pas de décimales, pas de signes dollar, rien. Alors qu'y aurait-il à varier selon la culture?

Y a-t-il des cultures qui en fait add une sorte de mise en forme lorsque vous appelez la Int32.ToString() sans paramètre? Ou s'agit-il d'un bogue dans la version bêta de ReSharper, et cet avertissement ne s'applique vraiment pas à Int32 (Auquel cas je déposerai un rapport de bogue ReSharper)?

64
Joe White

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 passer outre 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 programmation:

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

Comme testé sur un échantillon aléatoire d'ints, les 352 cultures installées avec Windows (CultureTypes.InstalledWin32Cultures) donne 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 quiconque ait jamais 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. Qu'attendaient-ils d'autre?

> int.MaxValue.ToString(CultureInfo.AncientRome)
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM....
23
Colonel Panic

Oui. Cela dépend de la culture actuelle. À partir des documents MSDN :

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

mettre l'accent

Resharper veut très probablement que vous soyez explicite sur la culture que vous avez l'intention d'utiliser. Depuis son omission, il repose sur un comportement qui peut changer lorsqu'il est exécuté sur différentes machines.

3
Jeff Mercado

C'est étrange; Je m'attendais à ce que 50.ToString (CultureInfo.CreateSpecificCulture ("ar-AE")) renvoie "٥٠", mais ce n'est pas le cas.

Je viens de chercher cela, et le problème semble être que NumberFormatInfo.DigitSubstitution n'est pas réellement implémenté

La propriété DigitSubstitution est réservée pour une utilisation future. Actuellement, il n'est pas utilisé dans les opérations d'analyse ou de formatage pour l'objet NumberFormatInfo actuel.

Ainsi, bien qu'il existe une énumération System.Globalization.DigitShapes, elle n'est pas réellement implémentée dans le bit NumberFormatInfo de IFormatProvider.

3
Richard Gadsden

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

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

Il y a donc une surprise.

La question devrait être de savoir pourquoi l'actuel Resharper ne le suggère pas.

0
ChrisBD