Спасибо всем, кто предложил свой опыт и предложения.
Реализация пользовательского типа / структуры для хранения моих собственных десятичных значений была не совсем тем, что мне было нужно, и не дала бы мне необходимой функциональности (я уже могу отображать десятичные значения в соответствующей местной валюте / формате). Я просто не смог преобразовать их обратно в британский формат при необходимости).
Проблема была в этой строке в веб-конфигурации:
<globalization culture="auto" enableClientBasedCulture="true"/>
Установка culture = "auto" позволяла .NET устанавливать языковой стандарт в соответствии со значениями, предоставленными браузером (между прочим, кстати, enableClientBasedCulture не реализован, в соответствии с MSDN - так что вы можете его опустить). Следовательно, если посетитель из Франции (с языком 'fr-FR', настроенным в их браузере) посетит наш сайт, все форматирование чисел будет работать идеально (правильный десятичный разделитель и символ валюты), но у меня возникнет проблема позже при попытке преобразовать это число из европейского формата в нужный мне британский / американский формат.
Это странно, но преобразование «123.00» в локаль «fr-FR» создает исключение FormatException, поскольку «123.00» недопустимо во французской локали (ожидается «123,00»). Но преобразование «123,00» (франк-франк) в британский / американский формат «en-GB» или «en-US» НЕ приводит к ошибке, вместо этого значение становится «123,000». Я считаю, что это должно вызвать исключение FormatException, потому что нельзя допускать добавление еще одного нуля.
Решение, которое я реализовал, было следующим:
- Установите значение culture = "auto" для culture = "en-GB" в web.config.
- Использовать Decimal.ToString ("c", ni) - где 'ni' - это собственный класс NumberFormatInfo.
Поскольку мой существующий код подключается к нашему источнику данных для получения правильных десятичных значений в зависимости от страны, у меня теперь была только проблема с форматированием. Таким образом, чтобы отформатировать число в соответствии с локалью 'fr-FR', вы можете сделать:
NumberFormatInfo ni = Globalization.CultureInfo.GetCultureInfo("fr-FR").NumberFormat;
Decimal.ToString("c", ni);
В этой настройке все мои десятичные значения (внутренне) всегда обрабатываются как десятичные дроби en-GB, и, следовательно, в требуемом формате. Другими словами, мое приложение не требовало гибкости, чтобы иметь возможность изменять настройки, которые применяются ко всему текущему потоку; скорее наоборот: я заботился только о форматировании значений по-разному.