Является ли 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.
В в некоторых странах они будут использовать десятичные знаки или пробел вместо запятых.