2011-08-03 39 views
16

如何獲得特定文化的貨幣模式?如何獲得特定文化貨幣模式

例如:

而不是使用:

string.Format("{0:c}", 345.10) 

我想用這個。

string.Format("#.##0,00 €;-#.##0,00 €", 345.10); 

但我如何獲取模式字符串(如「### 0,00€; - #。## 0,00€「)我的應用程序需要每種文化?

我不能使用「{0:c}」模式,因爲如果用戶切換語言,貨幣應該是相同的。

回答

18

A CultureInfo包含一個NumberFormatInfo,此類描述(除別的之外)如何爲這種貨幣格式化特定的文化。

尤其是您可以使用CurrencyPositivePatternCurrencyNegativePattern來確定貨幣符號是放在金額的前後,當然是CurrencySymbol以獲得正確的貨幣符號。所有這些信息都被使用。NET使用C格式說明符時。

您可以在MSDN上了解有關NumberFormatInfo class的更多信息。

以下代碼演示了正確格式化貨幣所需的一些步驟。它只使用CurrencySymbolCurrencyPositivePatternCurrencyDecimalDigits,因此是不完整的:

var amount = 123.45M; 
var cultureInfo = CultureInfo.GetCultureInfo("da-DK"); 

var numberFormat = cultureInfo.NumberFormat; 
String formattedAmount = null; 
if (amount >= Decimal.Zero) { 
    String pattern = null; 
    switch (numberFormat.CurrencyPositivePattern) { 
    case 0: 
     pattern = "{0}{1:N" + numberFormat.CurrencyDecimalDigits + "}"; 
     break; 
    case 1: 
     pattern = "{1:N" + numberFormat.CurrencyDecimalDigits + "}{0}"; 
     break; 
    case 2: 
     pattern = "{0} {1:N" + numberFormat.CurrencyDecimalDigits + "}"; 
     break; 
    case 3: 
     pattern = "{1:N" + numberFormat.CurrencyDecimalDigits + "} {0}"; 
     break; 
    } 
    formattedAmount = String.Format(cultureInfo, pattern, numberFormat.CurrencySymbol, amount); 
} 
else { 
    // ... 
} 

Console.WriteLine(formattedAmount); 

當然,你可以簡單地使用:

是所有數字格式的作品
var amount = 123.45M; 
var cultureInfo = CultureInfo.GetCultureInfo("da-DK"); 
var formattedAmount = String.Format(cultureInfo, "{0:C}", amount); 
Console.WriteLine(formattedAmount); 
+0

這種方式,我試圖。我是否需要實現一個開關來確定我自己使用的模式? CurrencyNegativePattern例如有15個選項。或者有沒有辦法獲得字符串值而不是int數?編輯:你已經回答了。 – naishx

2

您是否嘗試過使用string.Format("{0:N2} €", 345.10)?這應該在用戶文化中格式化爲小數點後兩位,後跟一個空格和歐元符號。

+0

我想過這樣的事情,但在某些語言中貨幣符號在值expamle之前:「SFr。123'456.00」 – naishx

+0

我認爲我誤解了這個問題。我認爲你試圖將貨幣維持爲歐元而不考慮地區。 – detaylor

1

的下面試驗說明了如何實現這一點:

[Test] 
    public void DisplayEurosInGreeceAndEngland() 
    { 
     var val = 125.22m; 
     Thread.CurrentThread.CurrentCulture 
      = Thread.CurrentThread.CurrentUICulture 
       = new CultureInfo("el-GR"); 

     Console.WriteLine(string.Format("{0:n} €", val)); 

     Thread.CurrentThread.CurrentCulture 
      = Thread.CurrentThread.CurrentUICulture 
       = new CultureInfo("en-GB"); 

     Console.WriteLine(string.Format("{0:n} €", val)); 
    } 

通過使用標準十進制表示從當前選擇的培養物,可以顯示任何給定值跳過貨幣,這可以分別對待。

+1

謝謝,但我不能使用這個解決方案,因爲我使用DevExpress網格,這隻接受字符串格式模式。 – naishx

+0

我認爲你可以專門使用{0:n}。查看以下信息:http://documentation.devexpress.com/#WindowsForms/CustomDocument2141 –

+1

「{0:n}」格式使用_Number_格式,圖書館竭盡全力將其與_Currency_格式區分開來。而在一些重要的國家。 –

0

您需要格式化您的貨幣/雙用:基於ISO代碼

money.ToString("C", culture); 

困難的部分實際上是獲得正確的文化。我不知道你如何跟蹤你需要的文化。請記住,這只是您的錢的格式,而不是轉換爲到不同的貨幣/文化!

更多細節:

ISOCurrencySymbol是RegionInfo,您可以創建基於CultureInfo的,你可以從當前線程的文化設置檢索的一部分。您應該創建一個實現字典的單例,以從ISOCurrencyCode轉換爲CultureInfo。

10

我想你問的是如何更改貨幣符號,但保持文化特定的格式。

Thread.CurrentThread.CurrentCulture = new CultureInfo("de"); 
// pretend we are german 

var nfi = (NumberFormatInfo)NumberFormatInfo.CurrentInfo.Clone(); 
nfi.CurrencySymbol = "$$$"; 
Console.WriteLine(string.Format(nfi,"{0:c}",345.10)); 

這將輸出:

345,10 $$$ 

在不改變其輸出CurrentCulture(對我來說):

您可以獲取當前 NumberFormatInfo的副本,並修改 CurrencySymbol屬性來完成這個
$$$345.10 
2

快速和骯髒的方法是:

var culture = CultureInfo.GetCultureInfo("el-GR"); 
var numberFormat = (NumberFormatInfo)culture.NumberFormat.Clone(); 
numberFormat.CurrencySymbol = "€"; // Force the currency symbol regardless of culture 
var specifier = "C";    // Or any other format specifier 
var positivePattern = 1110.ToString(specifier, numberFormat).Replace('1', '#'); 
var negativePattern = (-1110).ToString(specifier, numberFormat).Replace('1', '#'); 
var pattern = positivePattern + ";" + negativePattern; 

在這種情況下,模式等於「#。## 0,00€; - #。## 0,00€」。這避免了很多頭痛,試圖找出所有的排列組合。我很感激被問到的問題,因爲它幫助我強迫我找到更簡單的答案。