如何獲得特定文化的貨幣模式?如何獲得特定文化貨幣模式
例如:
而不是使用:
string.Format("{0:c}", 345.10)
我想用這個。
string.Format("#.##0,00 €;-#.##0,00 €", 345.10);
但我如何獲取模式字符串(如「### 0,00€; - #。## 0,00€「)我的應用程序需要每種文化?
我不能使用「{0:c}」模式,因爲如果用戶切換語言,貨幣應該是相同的。
如何獲得特定文化的貨幣模式?如何獲得特定文化貨幣模式
例如:
而不是使用:
string.Format("{0:c}", 345.10)
我想用這個。
string.Format("#.##0,00 €;-#.##0,00 €", 345.10);
但我如何獲取模式字符串(如「### 0,00€; - #。## 0,00€「)我的應用程序需要每種文化?
我不能使用「{0:c}」模式,因爲如果用戶切換語言,貨幣應該是相同的。
A CultureInfo
包含一個NumberFormatInfo
,此類描述(除別的之外)如何爲這種貨幣格式化特定的文化。
尤其是您可以使用CurrencyPositivePattern
和CurrencyNegativePattern
來確定貨幣符號是放在金額的前後,當然是CurrencySymbol
以獲得正確的貨幣符號。所有這些信息都被使用。NET使用C
格式說明符時。
您可以在MSDN上了解有關NumberFormatInfo class的更多信息。
以下代碼演示了正確格式化貨幣所需的一些步驟。它只使用CurrencySymbol
,CurrencyPositivePattern
和CurrencyDecimalDigits
,因此是不完整的:
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);
的下面試驗說明了如何實現這一點:
[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));
}
通過使用標準十進制表示從當前選擇的培養物,可以顯示任何給定值跳過貨幣,這可以分別對待。
謝謝,但我不能使用這個解決方案,因爲我使用DevExpress網格,這隻接受字符串格式模式。 – naishx
我認爲你可以專門使用{0:n}。查看以下信息:http://documentation.devexpress.com/#WindowsForms/CustomDocument2141 –
「{0:n}」格式使用_Number_格式,圖書館竭盡全力將其與_Currency_格式區分開來。而在一些重要的國家。 –
您需要格式化您的貨幣/雙用:基於ISO代碼
money.ToString("C", culture);
困難的部分實際上是獲得正確的文化。我不知道你如何跟蹤你需要的文化。請記住,這只是您的錢的格式,而不是轉換爲到不同的貨幣/文化!
更多細節:
ISOCurrencySymbol是RegionInfo,您可以創建基於CultureInfo的,你可以從當前線程的文化設置檢索的一部分。您應該創建一個實現字典的單例,以從ISOCurrencyCode轉換爲CultureInfo。
我想你問的是如何更改貨幣符號,但保持文化特定的格式。
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
快速和骯髒的方法是:
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€」。這避免了很多頭痛,試圖找出所有的排列組合。我很感激被問到的問題,因爲它幫助我強迫我找到更簡單的答案。
這種方式,我試圖。我是否需要實現一個開關來確定我自己使用的模式? CurrencyNegativePattern例如有15個選項。或者有沒有辦法獲得字符串值而不是int數?編輯:你已經回答了。 – naishx