【问题标题】:Creating a NumberFormat for an existing .NET CultureInfo in ASP.NET application在 ASP.NET 应用程序中为现有的 .NET CultureInfo 创建 NumberFormat
【发布时间】:2010-03-22 20:46:36
【问题描述】:

无论选择何种文化,我都希望以一致的方式在整个应用程序中格式化我的数字。事实上,即使对于我们使用的基本文化来说,它也是“非标准”的。

我想将“{1500.50:c}”格式化为:“1500.50”,但我的文化“nl-NL”的标准是:“€ 1.500,00”。我们没有注册自定义文化的用户权限,因为它是一个 web 应用程序,因此我们正在寻找一个运行时解决方案。

我们想要一个“一劳永逸”的解决方案。不是具有静态(扩展)方法的 Util 类,而是应用程序范围的解决方案,因此我们可以继续使用标准的 .ToString("c") 或 ToString("N") 逻辑,这将遵循我们的自定义规则。这将改变文化的 .NumberFormat,但如何?一切似乎都是只读的。

谢谢。

【问题讨论】:

    标签: .net asp.net globalization cultureinfo


    【解决方案1】:

    我将创建一个基类,您的所有页面都在该基类上派生,并为那里的文化设置所需的参数,如下所示:

    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();
        }
    }
    

    【讨论】:

    • .CreateSpecificCulture 是我缺失的环节,我无法获得可写的文化。我已将它放在 Global.axas (HttpApplication) .Begin_Request 事件中。现在每个请求都被分配了我的文化。
    【解决方案2】:

    如果您真的想以一致的方式格式化您的数字,无论选择哪种文化,您都应该使用特定的格式模式(“#.##”)以及 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;
    

    【讨论】:

    • 重点是我们需要支持 2 种不同的风格,它们与我们使用的文化脱节,但应该在整个应用程序中应用。使用不变文化模式进行格式化并不是最佳解决方案。感谢您的意见。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-10
    • 2021-03-23
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    相关资源
    最近更新 更多