我希望在整个应用程序中以一致的方式格式化我的数字,无论选择哪种文化。事实上,即使对于我们正在使用的基本文化来说,它也是“非标准”的。
我想将“{1500.50:c}”格式设置为:“1500.50”,但我的文化“nl-NL”的标准是:“€ 1.500,00”。由于它是一个网络应用程序,我们没有注册自定义区域性的用户权限,因此我们正在寻找运行时解决方案。
我们想要一个“一劳永逸”的解决方案。不是具有静态(扩展)方法的 Util 类,而是应用程序范围的解决方案,因此我们可以继续使用标准 .ToString("c") 或 ToString("N") 逻辑,这将遵循我们的自定义规则。这将改变文化的 .NumberFormat,但是如何改变呢?一切似乎都是只读的。
谢谢。
我将创建一个基类,在该基类上派生所有页面,并为那里的文化设置所需的参数,如下所示:
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();
}
}
如果您确实希望以一致的方式格式化数字,无论选择哪种区域性,您都应该使用特定的格式模式(“#.##”)和 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;
在将一些“旧版”.NET 站点和服务从一台 Web 服务器迁移到另一台 Web 服务器时,我遇到了类似的情况。
我最终编写了一个 IIS 模块,无需编辑代码即可覆盖主机货币、数字和日期/时间格式(由主机服务器的区域设置决定)。最初,它不支持全局覆盖(无论文化如何都应用特定格式),但这似乎是一个很大的增强,因此已添加。
它可以自定义货币符号、小数分隔符、数字组分隔符、长日期格式、短日期格式...基本上所有属性都可以通过 .NET 中的 NumberFormatInfo 和 DateTimeFormatInfo 对象显式设置。全部通过 web.config 文件完成(即:无需更改代码)。
希望这可以节省一些人的时间和/或挫败感。