簡體   English   中英

使用自定義貨幣代碼格式化貨幣(ASP.NET Core MVC)

[英]Format currency with custom currency code (ASP.NET Core MVC)

我正在開發一個ASP.NET核心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 由於這是一個擴展類,我想依賴注入是不合適的。

如果您仍在尋找答案,我已經調整了您的擴展方法來緩存克隆的文化信息對象。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM