2010-03-05 6 views
5

Когда я пытаюсь преобразовать строку в числовое значение с 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)

Приветствия Лоик

ответ

0

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

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

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

+0

Да, но на самом деле я хочу использовать функцию Convert.ChangeType, чтобы сделать общую строку для числового преобразователя и предоставить ее как расширение строки. Но Convert.ChangeType не имеет перегрузки с параметром NumberStyles. Он просто разрешает параметр IFormatProvider. И, кстати, я не понимаю, почему параметр Defaut для Parse не соответствует моим международным настройкам системы, где используется разделитель групп. – Loic

2

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

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

+0

Я согласен. Но моя проблема (утверждать, что культура - это fr-FR, а разделитель тысяч - пробельный символ), почему: Следующая строка работает: double d = (double) Convert.ChangeType ("1 234", typeof (double), _culture); В то время как следующая строка генерирует исключение формата? int i = (int) Преобразование.ChangeType ("1 234", typeof (int), _culture); – Loic

0

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

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

+0

Здравствуйте, благодарю вас за помощь. Мое приложение позволяет пользователю изменять язык как время выполнения (мы предоставляем 7 языков с разными языками). Мы меняем CurrentUICulture и CurrentCulture, когда пользователь выбирает язык. Мы хотим, чтобы пользователь просматривал/вводил даты и числа в качестве выбранного языка, а не как локаль, установленную в системе. – Loic

 Смежные вопросы

  • Нет связанных вопросов^_^