Преобразование строки в число и разделитель групп

Когда я пытаюсь преобразовать строку в числовое значение с помощью Parse, TryParse или Convert.ChangeType, я не могу управлять разделителем тысяч, как он определен в системе:

если я ввожу:

var d = double.Parse("1,234", CultureInfo.CurrentUICulture);

он не возвращает 1234.

Если я хочу использовать разделитель групп, я должен ввести:

var d = double.Parse("1,234", NumberStyles.Number, CultureInfo.CurrentUICulture);

На этот раз результат ожидаемый.

Но я не хочу принудительно использовать разделитель тысяч, я хочу использовать его только в том случае, если система укажет его в настройках глобализации. Есть ли способ узнать, используется ли разделитель (я знаю, что могу прочитать разделитель групп в CultureInfo.CurrentUICulture.NumberFormat.NumberGroupSeparator)

Ура, Лоик


person Loic    schedule 05.03.2010    source источник


Ответы (3)


Наличие Number (включая AllowThousands) не требует запятой — оно просто разрешает ее. Таким образом, вы можете использовать Number с запятой или без нее. Или используйте Any или AllowThousands.

Обратите внимание, что «запятую» можно поменять местами с «разделителем тысяч» - т.е. в некоторых странах Европы он может отличаться (точка и т. д.). Если вы имеете в виду "запятая – тысячи", используйте фиксированный язык и региональные параметры (например, InvariantCulture).

person Marc Gravell    schedule 05.03.2010
comment
Согласен. Но моя проблема (утверждаю, что культура - это «fr-FR», а разделитель тысяч - пробел), почему: работает следующая строка: double d = (double)Convert.ChangeType(1 234, typeof (double), _culture) ; В то время как следующая строка вызывает исключение формата? int i = (int)Convert.ChangeType(1 234, typeof (int), _culture); - person Loic; 10.03.2010

Вы всегда можете использовать вторую строку, которую вы используете

var d = double.Parse("1,234", NumberStyles.Number, CultureInfo.CurrentUICulture);

поскольку он будет правильно преобразовывать 1234, а также 1234, и он должен охватывать 1,234 в системах, использующих «.». как разделитель групп

person Dan McClain    schedule 05.03.2010
comment
Да, но на самом деле я хочу использовать функцию Convert.ChangeType, чтобы преобразовать общую строку в числовой и предоставить ее как расширение строки. Но Convert.ChangeType не имеет перегрузки с параметром NumberStyles. Он просто разрешает параметр IFormatProvider. И, кстати, я не понимаю, почему настройка по умолчанию для Parse не соответствует международным настройкам моей системы, где установлено использование разделителя групп. - person Loic; 08.03.2010

Вы должны анализировать пользовательский ввод, используя CurrentCulture, а не CurrentUICulture.

Свойство CurrentUICulture относится к языку, на котором отображается пользовательский интерфейс, а CurrentCulture к текущему языковому стандарту, указанному в Windows. Таким образом, пользователь, работающий с приложением, которое предоставляет пользовательский интерфейс, переведенный на английский язык (CurrentUICulture), по-прежнему может просматривать/вводить, например, даты и числа, отформатированные в соответствии с языковым стандартом, который он установил в Windows (CurrentCulture).

person João Angelo    schedule 05.03.2010
comment
Здравствуйте, спасибо за вашу помощь. Мое приложение позволяет пользователю менять язык во время выполнения (мы предоставляем 7 разных языков). Мы изменяем CurrentUICulture и CurrentCulture, когда пользователь выбирает язык. Мы хотим, чтобы пользователь просматривал/вводил даты и числа как выбранный язык, а не как локаль, установленную в системе. - person Loic; 08.03.2010