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

ui7jx7zq  于 5个月前  发布在  .NET
关注(0)|答案(3)|浏览(70)

我希望在整个应用程序中以一致的方式设置数字格式,而不管选择的是什么区域性。事实上,即使对于我们使用的基本区域性,这也是“非标准的”。
我想将“{1500.50:c}”的格式设置为:“1500.50”,但区域性“nl-NL”的标准为:“€ 1.500,00”。由于它是一个Web应用程序,因此我们没有注册自定义区域性的用户权限,因此我们正在寻找运行时解决方案。
我们想要一个“设置并忘记”的解决方案。不是一个具有静态(扩展)方法的Util类,而是一个应用程序范围的解决方案,这样我们就可以继续使用标准的.ToString(“c”)或ToString(“N”)逻辑,这将遵循我们的自定义规则。这将是改变Culture的.NumberFormat,但是怎么做呢?所有的东西似乎都是只读的。
谢谢.

hfyxw5xn

hfyxw5xn1#

如果您确实希望无论选择何种区域性都以一致的方式设置数字格式,则应使用特定的格式模式(“#.##”)沿着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;

字符串

ippsafx7

ippsafx72#

在将一些“遗留”.NET站点和服务从一个Web服务器迁移到另一个Web服务器时,我遇到了类似的问题。
最后我写了一个IIS module来支持覆盖主机的货币,数字和日期/时间格式(由主机服务器的区域设置决定)而无需编辑代码。最初,它不支持全局覆盖(无论文化如何都应用特定格式),但这似乎是一个很大的增强,所以已经添加。
它可以自定义货币符号,小数点分隔符,数字组分隔符,长日期格式,短日期格式......基本上所有的属性都可以通过. NET中的NumberFormatInfoDateTimeFormatInfo对象显式设置。所有这些都可以通过web.config文件完成(即:不需要更改代码)。
希望这可能会保存一些人的时间和/或挫折。

yzxexxkh

yzxexxkh3#

我会创建一个基类,所有的页面都是在这个基类上派生的,并设置你想要的文化参数,如下所示:

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

相关问题