Как стать автором
Обновить

Комментарии 16

А как обрабатывается ситуация, когда пользователь в системный настройках выбрал страну и язык, а потом заменил запятую на точку?
О том, что культура может не соответствовать дефолтным настройкам, сигнализирует свойство CultureInfio.UseUserOverride. Этот же параметр отражен в перегрузках конструкторов CultureInfo. Для культур потока значение true, а, например, для полученных через CultureInfo.GetCultureInfo(String)false.
Ага. А всё же вопрос — есть некая системная локаль (культура), пользователь переопределил в её свойствах запятую/точку. Запускаем программу. Что будет использоваться в программе по-умолчанию?
Предполагаю, что пользовательское. Так как UseUserOverride, по умолчанию, true.
Если самому не переприсваивать CurrentCulture потока, то культура будет соответствовать настройкам Windows. И в .NET мы тоже получим, например, точку вместо стандартной запятой.
Как раз сегодня столкнулся при парсинге числа из строки в double, что надо не запятую, а точку :)
Тоже сталкивался с такой проблемой и в инете нашёл решение.

string s = s.Replace(",", CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator);
decimal count = decimal.Parse(s, NumberStyles.Any, CultureInfo.InvariantCulture);
Почему в .NET нет культуры MD? Потому что это расшифровывается как Must Die:)
Environment.NewLine

Так вот откуда его брать! Спасибо!
Там еще много всякого, рекомендую заглянуть в сам класс :)
А я помню багу в одном разрабатываемом на .net продукте, которая проявлялась только при использовании турецкого языка.
Суть баги в том, что в турецком языке есть две буквы «i» — одна с точкой и одна без точки. Поэтому если например делать toUpper для маленькой английской буквы «i», то в результате получится большая турецкая буква "İ" с точкой.
В результате все методы сравнения строк в которых использовалось изменение регистра давали ложные срабатывания.
Бага фиксается путем замены методов сравнения на специальные, которые используют invariant culture, но тогда конечно об этом никто не думал.
Это давно известно как The Turkey Test.
Владислав, плюсую!
Если ваш продукт очень тесно связан с глобализацией и локализацией, то скорее всего вы подписаны на уведомления об изменениях в стандарте www.iso.org/iso/home/standards/country_codes.htm
За последнее время Microsoft сильно причесала информацию по языкам, переименовала страны, вынесла из названия Latin и Cyrillic, добавила много новых культур (Windows 7). В .Net с этим всё попроще, а вот в плюсах приходится иметь дело с LCID и там всё куда запутанней. Одно разделение хорватского на три языка (primary language остался одинаковым) столько геморроя создало. Сейчас существует уже несколько языков у которых название зависит от страны Sami, Norway Bokmal, Upper Sorbian. Так что приходится постоянно следить, чтобы языки в интерфейсе отображались адекватно и группировка по primary language ничего не сломала.
Спасибо, теперь подписан.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации