Является ли 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)?

Ответ 1

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

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 = "!";

Ответ 2

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

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

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

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

Ответ 3

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

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

акцент мой

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

Ответ 4

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

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

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

Итак, хотя есть перечисление System.Globalization.DigitShapes, оно фактически не реализовано в бите NumberFormatInfo IFormatProvider.

Ответ 5

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

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

Итак, есть сюрприз.

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

Ответ 6

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

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