0

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

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

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

谢谢。

4

2 回答 2

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();
    }
}
于 2010-03-22T21:02:59.427 回答
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;
于 2010-03-23T19:57:04.230 回答