Создание NumberFormat для существующего .NET CultureInfo в приложении ASP.NET - PullRequest
0 голосов
/ 22 марта 2010

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

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

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

Спасибо.

Ответы [ 2 ]

1 голос
/ 23 марта 2010

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

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();
    }
}
0 голосов
/ 23 марта 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;
...