Создание NumberFormat для существующей .NET CultureInfo в приложении ASP.NET

Я хочу форматировать свои числа во всем приложении единым образом, независимо от того, какая культура выбрана. На самом деле, это «нестандартно» даже для базовой культуры, которую мы используем.

Я хочу отформатировать «{1500.50:c}» как: «1500,50», но стандарт для моей культуры «nl-NL»: «1 500,00 евро». Поскольку это веб-приложение, у нас нет прав пользователя для регистрации пользовательских культур, поэтому мы ищем решение для выполнения.

Нам нужно решение «установил и забыл». Не класс Util со статическими (расширяющими) методами, а решение для всего приложения, поэтому мы можем продолжать использовать стандартную логику .ToString("c") или ToString("N"), которая будет следовать нашим собственным правилам. Это должно изменить .NumberFormat культуры, но как? Вроде все только для чтения.

Спасибо.


person Gabriël    schedule 22.03.2010    source источник


Ответы (2)


Я бы создал базовый класс, на котором основаны все ваши страницы, и установил бы параметры, которые вы хотите для культуры, следующим образом:

public class PageBase : Page
{
    protected override void InitializeCulture()
    {
        var culture = CultureInfo.CreateSpecificCulture( CultureInfo.CurrentCulture.Name );
        culture.NumberFormat.CurrencySymbol = string.Empty;
        culture.NumberFormat.NumberDecimalDigits = 2;
        culture.NumberFormat.NumberDecimalSeparator = ".";
        culture.NumberFormat.NumberGroupSeparator = ",";
        Thread.CurrentThread.CurrentCulture = culture;
        Thread.CurrentThread.CurrentUICulture = culture;

        base.InitializeCulture();
    }
}

Или вы можете построить свою культуру на основе существующей:

public class PageBase : Page
{
    protected override void InitializeCulture()
    {
        var culture = CultureInfo.CreateSpecificCulture( "en-US" );
        culture.NumberFormat.CurrencySymbol = string.Empty;
        Thread.CurrentThread.CurrentCulture = culture;
        Thread.CurrentThread.CurrentUICulture = culture;

        base.InitializeCulture();
    }
}
person Thomas    schedule 22.03.2010
comment
.CreateSpecificCulture был моим недостающим звеном, я не мог получить доступную для записи культуру. Я поместил его в событие Global.axas (HttpApplication).Begin_Request. Теперь каждому запросу назначается моя культура. - person Gabriël; 23.03.2010

Если вы действительно хотите отформатировать свои числа согласованным образом, независимо от того, какой язык и региональные параметры выбраны, вы должны либо использовать определенный шаблон формата («#.##») вместе с InvariantCulture (если инвариантный язык и региональные параметры не имеют значений вы хотите для свойств числового формата, вы можете создать свой собственный «Инвариантный» культура для этой цели.Установка текущей культуры потока может иметь другие непредвиденные последствия, так как эта культура будет использоваться по умолчанию для всего форматирования и синтаксического анализа, некоторые из которых могут быть за пределами вашего контроль.

Кстати, вам не обязательно использовать CreateSpecificCulture; вы можете просто создать CultureInfo напрямую:

        CultureInfo currentWithOverriddenNumber = new CultureInfo(CultureInfo.CurrentCulture.Name);
        currentWithOverriddenNumber.NumberFormat.CurrencyPositivePattern = 0; // make sure there is no space between symbol and number
        currentWithOverriddenNumber.NumberFormat.CurrencySymbol = ""; // no currency symbol
        currentWithOverriddenNumber.NumberFormat.CurrencyDecimalSeparator = "."; //decimal separator
        currentWithOverriddenNumber.NumberFormat.CurrencyGroupSizes = new int[] { 0 }; //no digit groupings
        currentWithOverriddenNumber.NumberFormat.NumberGroupSizes = new int[] { 0 };
        currentWithOverriddenNumber.NumberFormat.NumberDecimalSeparator = "."; //decimal separator

        Thread.CurrentThread.CurrentCulture = currentWithOverriddenNumber;
person Eric MSFT    schedule 23.03.2010
comment
Дело в том, что нам нужно поддерживать 2 разных стиля, которые не связаны с культурой, которую мы используем, но должны применяться во всем приложении. Форматирование с использованием шаблона инвариантной культуры не является оптимальным решением. Спасибо за отзыв. - person Gabriël; 25.03.2010