gpt4 book ai didi

c# - 使用自定义货币代码格式化货币(ASP.NET Core MVC)

转载 作者:行者123 更新时间:2023-11-30 16:42:50 24 4
gpt4 key购买 nike

我正在开发一个 ASP.NET Core MVC 1.1 应用程序,我正在努力寻找一个干净高效的格式化解决方案 decimal作为具有自定义货币代码的货币(即不同于 CultureInfo 中指定的货币)。

目前,我有以下 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);
}
}

我目前的解决方案由两部分组成:

  1. 从货币代码到货币符号的映射。
  2. 正在创建一个新的 CultureInfo右边的实例CurrencySymbol属性(property)。

可悲的是,我不喜欢任何一部分。

对于第一部分,我可以将映射放入 appsettings.json并填写 DictionaryStartup类(class)。但是,我仍然更愿意完全跳过这一点并迭代系统支持的文化和货币。但是,根据我的研究,这在 ASP.NET Core MVC 1.1 中尚不可行。

对于第二部分,我不喜欢 Clone()部分。自 CultureInfo.CurrentCulture是只读的,我可能不得不在某个时候克隆它,但最好不是在每次调用我的扩展方法时。

有什么方法可以缓存克隆和更改的 CultureInfo ?由于这是一个扩展类,我想依赖注入(inject)是不可能的。

最佳答案

如果您仍在寻找答案,我已经调整了您的扩展方法以缓存克隆的文化信息对象。

public static class DecimalExtensions
{
private static readonly IDictionary<String, String> _currencyCodeToSymbol = new Dictionary<String, String>
{
{ "EUR", "€"},
{ "USD", "$"},
{ "GBP", "£"},
};

private static readonly ConcurrentDictionary<String, CultureInfo> _currencyCodeToLocale =
new ConcurrentDictionary<String, CultureInfo>();

public static String FormatCurrency(this Decimal decimalValue, String currencyCode = "USD")
{
if (!_currencyCodeToSymbol.ContainsKey(currencyCode))
{
throw new NotImplementedException($"Currency code {currencyCode} is not supported");
}

var cultureInfo = _currencyCodeToLocale.GetOrAdd(currencyCode, _ =>
{
var info = CultureInfo.CurrentCulture.Clone() as CultureInfo;
info.NumberFormat.CurrencySymbol = _currencyCodeToSymbol[currencyCode];
return info;
});

return decimalValue.ToString("C", cultureInfo);
}
}

关于c# - 使用自定义货币代码格式化货币(ASP.NET Core MVC),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45906173/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com