在ASP.NET应用程序中为现有.NET CultureInfo创建NumberFormat

时间:2010-03-22 20:46:36

标签: .net asp.net globalization cultureinfo

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

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

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

感谢。

2 个答案:

答案 0 :(得分: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();
    }
}

答案 1 :(得分:0)

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