Является ли Int32.ToString () культурно-ориентированным? - PullRequest
64 голосов
/ 13 декабря 2011

Я использую бета-версию ReSharper, и она дает мне предупреждения для следующего кода:

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

Предупреждение о вызове id.ToString(), и он говорит мне: "Укажите культуру в явном преобразовании строк". Я понимаю предупреждение и знаю, как его исправить - просто измените код на более громоздкий id.ToString(CultureInfo.InvariantCulture).

Но мой вопрос: это необходимо? Я имею в виду, очевидно, что важно указывать культуру, когда вы используете такие типы, как DateTime (разные культуры имеют разные форматы даты) и Double (разные символы используются для десятичной точки). Но Int32.ToString(), по крайней мере в en-US и инвариантных культурах, вообще не добавляет никакого форматирования. Без запятых, без десятичных знаков, без знаков доллара, ничего. Так что же будет меняться в зависимости от культуры?

Существуют ли культуры, которые на самом деле добавляют какое-то форматирование, когда вы вызываете Int32.ToString() без параметров? Или это ошибка в бета-версии ReSharper, и это предупреждение действительно не применимо к Int32 (в этом случае я отправлю отчет об ошибке ReSharper)?

Ответы [ 6 ]

60 голосов
/ 13 декабря 2011

Операционная система позволяет изменить отрицательный знак для чисел.

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 = "!";
22 голосов
/ 26 сентября 2013

Как было протестировано на случайной выборке целых, все 352 культуры, установленные с Windows (CultureTypes.InstalledWin32Cultures), дают идентичные результаты.

Даниэль прав, заметив, что пользовательская культура может использовать другой префикс для отрицательных чисел, но я сомневаюсь, что кто-нибудь когда-либо использовал эту функцию, кроме случайного.

Я думаю, что разработчики .NET сделали это, чтобы соответствовать float и другим типам. Чего еще они ожидали?

> int.MaxValue.ToString(CultureInfo.AncientRome)
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM....
3 голосов
/ 22 января 2015

Это странно; Я ожидал бы, что 50.ToString (CultureInfo.CreateSpecificCulture ("ar-AE")) вернет "٥٠", но это не так.

Я только что посмотрел, и проблема в том, что NumberFormatInfo.DigitSubstitution на самом деле не реализовано

Свойство DigitSubstitution зарезервировано для использования в будущем. В настоящее время он не используется ни в операциях синтаксического анализа, ни в форматировании текущего объекта NumberFormatInfo.

Итак, хотя существует перечисление System.Globalization.DigitShapes, оно на самом деле не реализовано в бите NumberFormatInfo объекта IFormatProvider.

3 голосов
/ 13 декабря 2011

Да. Это зависит от текущей культуры. Из документов MSDN :

Возвращаемое значение форматируется с помощью общего числового спецификатора формата ("G") и объекта NumberFormatInfo для текущей культуры .

Акцент мой

Решарпер, скорее всего, хочет, чтобы вы четко указали, какую культуру вы намерены использовать. Поскольку его опускание зависит от поведения, которое может измениться при выполнении на разных машинах.

0 голосов
/ 03 июля 2012

Поскольку целые числа могут достигать 2 147 483 647.

В некоторых странах вместо запятых они будут использовать десятичные дроби или пробел.

0 голосов
/ 13 декабря 2011

Я бы сказал нет, но при проверке MSDN Int32.ToString () это так:

Возвращаемое значение форматируется с помощью общего числового спецификатора формата («G») и объекта NumberFormatInfo для текущей культуры.

Так что сюрприз.

Вопрос должен заключаться в том, почему нынешний Решарпер не предлагает этого?

...