Je lance une version bêta de ReSharper, et il me donne des avertissements pour le code suivant:
int id; // ... DoSomethingWith(id.ToSsortingng());
L’avertissement est sur l’appel id.ToSsortingng()
et il dit “Spécifiez une culture dans la conversion de chaîne explicitement”. Je comprends l’avertissement, et je sais comment le réparer – changez simplement le code en id.ToSsortingng(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 le point décimal). Mais Int32.ToSsortingng()
, au moins dans les cultures en-US et invariantes, n’ajoute aucun formatage. Pas de virgule, pas de point décimal, pas de signe dollar, rien. Alors, qu’est-ce qu’il y aurait à varier selon la culture?
Existe-t-il des cultures qui ajoutent une sorte de formatage lorsque vous appelez le paramètre Int32.ToSsortingng()
paramètre? Ou est-ce un bogue dans la version bêta de ReSharper, et cet avertissement n’est pas vraiment applicable à Int32
(auquel cas je produirai un rapport de bogue ReSharper)?
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 parameters 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 = "!";
Comme testé sur un échantillon aléatoire d’ints, toutes 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 quiconque ait déjà utilisé cette fonctionnalité par accident.
Je suppose que les développeurs .NET l’ont fait pour être compatible avec les types float et autres. Qu’attendaient-ils d’autre?
> int.MaxValue.ToSsortingng(CultureInfo.AncientRome) MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM....
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’object NumberFormatInfo pour la culture actuelle .
emphase mine
Il est très probable que Resharper souhaite que vous sachiez clairement quelle culture vous comptez utiliser. Étant donné que l’omettre, il repose sur un comportement qui peut changer lorsqu’il est exécuté sur des machines différentes.
C’est étrange; J’aurais attendu 50.ToSsortingng (CultureInfo.CreateSpecificCulture (“ar-AE”)) pour renvoyer “٥٠”, mais ce n’est pas le cas.
Je viens de regarder 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’parsing ou de formatage de l’object NumberFormatInfo en cours.
Donc, bien qu’il y ait une énumération System.Globalization.DigitShapes, elle n’est pas réellement implémentée dans le bit NumberFormatInfo de IFormatProvider.
J’aurais dit non, mais en vérifiant MSDN Int32.ToSsortingng (), 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’object NumberFormatInfo pour la culture actuelle.
Donc, il y a une surprise.
La question devrait être pourquoi le Resharper actuel ne le suggère pas?
Parce que les entiers peuvent être aussi élevés que 2,147,483,647.
Dans certains pays , ils utiliseraient des décimales ou un espace à la place des virgules.