我正在开发一个ASP.NET Core MVC 1.1应用程序,但我无法找到一种干净高效的解决方案来格式化带有自定义货币代码(即不同于CultureInfo
中指定的代码)的decimal
。
目前,我有以下decimal
扩展类:
public static class DecimalExtensions
{
public static readonly Dictionary<string, string> CurrencyCodeToSymbol = new Dictionary<string, string>() {
{ "EUR", "€"},
{ "USD", "$"},
{ "GBP", "£"},
};
public static string FormatCurrency(this decimal decimalValue, string currencyCode)
{
var culture = (CultureInfo) CultureInfo.CurrentCulture.Clone();
culture.NumberFormat.CurrencySymbol = CurrencyCodeToSymbol[currencyCode];
return decimalValue.ToString("C", culture);
}
}
我的当前解决方案由两部分组成:
- 将货币代码映射到货币符号。
- 使用正确的
CurrencySymbol
属性创建一个新的CultureInfo
实例。
不幸的是,我都不喜欢这两个部分。
对于第一部分,我可以将映射放入 appsettings.json
中,并在 Startup
类中填充 Dictionary
。但是,我仍然更喜欢完全跳过此步骤,并迭代系统支持的文化和货币。然而,经过我的研究,这在 ASP.NET Core MVC 1.1 中尚不可能。
对于第二部分,我根本不喜欢 Clone()
部分。由于 CultureInfo.CurrentCulture
是只读的,我可能需要在某个时候克隆它,但最好不要在每次调用扩展方法时都这样做。
有没有办法缓存克隆并修改后的 CultureInfo
?由于这是一个扩展类,我想依赖注入已经不再适用了。