Это 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 63

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.

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