2011-08-03 41 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€”。这避免了很多头痛,试图找出所有的排列组合。我很感激被问到的问题,因为它帮助我强迫我找到更简单的答案。