Это Int32.ToString () зависит от культуры?
я запускаю бета-версию ReSharper, и он дает мне предупреждения для следующего кода:
int id;
// ...
DoSomethingWith(id.ToString());
предупреждение на id.ToString()
вызов, и он говорит мне "указать язык и региональные параметры в преобразовании строки явно". Я понимаю предупреждение, и я знаю, как это исправить-просто измените код на гораздо более громоздкий id.ToString(CultureInfo.InvariantCulture)
.
но мой вопрос: это необходимо? Я имею в виду, очевидно, что важно указать культуру, когда вы используете такие типы, как DateTime
(разные культуры имеют разные форматы дат) и Double
(различные символы, используемые для десятичной точки). Но Int32.ToString()
, по крайней мере, в en-US и инвариантных культурах, не добавляет никакого форматирования вообще. Ни запятых, ни десятичных знаков, ни знаков доллара, ничего. Так что же будет меняться в зависимости от культуры?
есть ли некоторые культуры, которые на самом деле добавить какое-то форматирование при вызове без параметров Int32.ToString()
? Или это ошибка в бета-версии ReSharper, и это предупреждение действительно не применимо к Int32
(в этом случае я подам отчет об ошибке ReSharper)?
6 ответов:
операционная система позволяет менять отрицательный знак для чисел.
Control panel -> Language and regional settings -> Additional settings -> Negative sign
таким образом, текущая культура могла бы переопределить отрицательный знак. В этом случае вы должны соблюдать региональные настройки, это является причиной предупреждения. Вы также можете изменить отрицательный знак программно:
CultureInfo culture = Thread.CurrentThread.CurrentCulture; // Make a writable clone culture = (CultureInfo) culture.Clone(); culture.NumberFormat.NegativeSign = "!";
как проверено на случайной выборке ints, все 352 культуры установлены с Windows (
CultureTypes.InstalledWin32Cultures
) дают идентичные результаты.Даниэль прав, чтобы отметить, что пользовательская культура может использовать другой префикс для отрицательных чисел, но я сомневаюсь, что кто-либо когда-либо использовал эту функцию, кроме как случайно.
Я думаю, что разработчики .NET сделали это, чтобы соответствовать float и другим типам. А чего еще они ожидали?
> int.MaxValue.ToString(CultureInfo.AncientRome) MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM....
да. Это зависит от текущей культуры. Из MSDN docs:
возвращаемое значение форматируется с использованием описателя общего числового формата ("G") и объект NumberFormatInfo для текущего языка и региональных параметров.
выделено мной
Resharper просто, скорее всего, хочет, чтобы Вы были откровенны о том, какую культуру вы собираетесь использовать. Поскольку опущение зависит от поведения, которое может измениться при выполнении на разные машины.
Это странно, я ожидал бы 50.ToString (CultureInfo.CreateSpecificCulture ("ar-AE")), чтобы вернуть" ٥٠", но это не так.
Я только что посмотрел это, и проблема, кажется, в том, что NumberFormatInfo.DigitSubstitution фактически не выполнены
свойство DigitSubstitution зарезервировано для использования в будущем. В настоящее время он не используется ни в синтаксическом анализе, ни в операциях форматирования для текущего NumberFormatInfo объект.
Итак, хотя есть система перечисления.Глобализация.Эквивалентно перечислимому, это на самом деле не внедрены в свойства numberformatinfo бит объекта iformatprovider.
Я бы сказал нет, но при проверке MSDN Int32.ToString () вот это:
возвращаемое значение форматируется с помощью спецификатора общего числового формата ("G") и объекта NumberFormatInfo для текущего языка и региональных параметров.
Так что есть сюрприз.
вопрос должен быть, почему текущий Resharper не предлагает этого?
потому что целые числа могут быть как 2,147,483,647.
на в некоторых странах, они будут использовать десятичные знаки или пробел вместо запятых.