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

3

我正在开发一个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);
  }
}

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

  1. 将货币代码映射到货币符号。
  2. 使用正确的 CurrencySymbol 属性创建一个新的 CultureInfo 实例。

不幸的是,我都不喜欢这两个部分。

对于第一部分,我可以将映射放入 appsettings.json 中,并在 Startup 类中填充 Dictionary。但是,我仍然更喜欢完全跳过此步骤,并迭代系统支持的文化和货币。然而,经过我的研究,这在 ASP.NET Core MVC 1.1 中尚不可能。

对于第二部分,我根本不喜欢 Clone() 部分。由于 CultureInfo.CurrentCulture 是只读的,我可能需要在某个时候克隆它,但最好不要在每次调用扩展方法时都这样做。

有没有办法缓存克隆并修改后的 CultureInfo?由于这是一个扩展类,我想依赖注入已经不再适用了。

1个回答

2
如果你仍在寻找答案,我已经修改了你的扩展方法,可以缓存克隆的区域信息对象。
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);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接