【问题标题】:Format currency with custom currency code (ASP.NET Core MVC)使用自定义货币代码格式化货币 (ASP.NET Core MVC)
【发布时间】:2017-09-12 07:14:32
【问题描述】:

我正在开发一个 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. 使用正确的 CurrencySymbol 属性创建一个新的 CultureInfo 实例。

很遗憾,我不喜欢任何一个部分。

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

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

有没有办法缓存克隆和更改的CultureInfo?由于这是一个扩展类,我猜依赖注入是不可能的。

【问题讨论】:

    标签: c# asp.net-mvc asp.net-core localization asp.net-core-mvc


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-31
      • 2011-06-27
      • 1970-01-01
      • 1970-01-01
      • 2014-01-17
      • 2014-06-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多