2011-11-19 221 views
3

我想了解貨幣格式在.NET框架中的工作原理。據我所知,Thread.CurrentCulture.NumberFormatInfo.CurrencySymbol包含本地文化的貨幣符號。.NET中的貨幣格式

但就我所見,在現實世界中,特定文化與貨幣符號之間並沒有明確的1對1關係。例如,我可能位於英國,但我以歐元開具發票。或者我可能住在冰島,並以美元從美國供應商收到發票。或者我可能住在瑞典,但我的銀行賬戶使用歐元。我意識到在某些情況下,您可能只想假設當地貨幣是可以使用的貨幣,但通常情況並非如此。

在這些情況下,我會克隆CultureInfo並在克隆上手動設置貨幣符號,然後在格式化數量時使用克隆?即使貨幣符號無效,我認爲使用NumberFormatInfo的其他屬性(如CurrencyDecimalSeparator)仍然有意義。

回答

6

當然。我已經使用基於a blog post by Matt Weber的技術來完成它。下面是一個使用文化格式貨幣(小數位等)的示例,但使用貨幣符號和適用於給定貨幣代碼的小數位數(因此,美國文化中的一百萬日元將被格式化爲¥1,000,000 )。

當然,您可以對其進行修改,以挑選並選擇保留當前文化和貨幣文化的哪些屬性。

public static NumberFormatInfo GetCurrencyFormatProviderSymbolDecimals(string currencyCode) 
{ 
    if (String.IsNullOrWhiteSpace(currencyCode)) 
     return NumberFormatInfo.CurrentInfo; 


    var currencyNumberFormat = (from culture in CultureInfo.GetCultures(CultureTypes.SpecificCultures) 
           let region = new RegionInfo(culture.LCID) 
           where String.Equals(region.ISOCurrencySymbol, currencyCode, 
                StringComparison.InvariantCultureIgnoreCase) 
           select culture.NumberFormat).First(); 

    //Need to Clone() a shallow copy here, because GetInstance() returns a read-only NumberFormatInfo 
    var desiredNumberFormat = (NumberFormatInfo)NumberFormatInfo.GetInstance(CultureInfo.CurrentCulture).Clone(); 
    desiredNumberFormat.CurrencyDecimalDigits = currencyNumberFormat.CurrencyDecimalDigits; 
    desiredNumberFormat.CurrencySymbol = currencyNumberFormat.CurrencySymbol; 

    return desiredNumberFormat; 
} 
+0

不錯!我沒有想到你可能也想使用十進制數字的事實,但這顯然是有道理的。 – Nitramk