如何获得特定的文化货币模式

我如何获得特定文化的货币模式?

例如:

而不是使用:

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

我想用这个:

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

但是我如何为我的应用程序需要的每种文化获得模式字符串(如“#。## 0,00€; – #。## 0,00€”)?

我不能使用“{0:c}”模式,因为如果用户切换语言,则货币应该相同。

CultureInfo包含NumberFormatInfo ,此类描述(除其他外)如何格式化该特定文化的货币。

特别是,您可以使用CurrencyPositivePatternCurrencyNegativePattern来确定货币符号是在金额之前还是之后,当然还有CurrencySymbol以获得正确的货币符号。 当使用C格式说明符时,.NET将使用所有这些信息。

您可以在MSDN上阅读有关NumberFormatInfo类的更多信息。

下面的代码演示了正确格式化货币所需的一些步骤。 它只使用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); 

我想你要问的是如何更改货币符号但保留特定于文化的格式。 您可以通过获取当前NumberFormatInfo的副本并修改CurrencySymbol属性来执行此操作:

 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它输出(对我来说):

 $$$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€”。 这避免了许多令人头疼的问题,试图弄清楚所有的排列。 我很欣赏被问到的问题,因为它帮助了我,并迫使我找到一个更简单的答案。

你尝试过使用string.Format("{0:N2} €", 345.10)吗? 这应格式化为用户区域中的2个小数位,后跟空格和欧元符号。

下面的测试说明了如何实现这一目标:

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

通过使用当前所选文化中的标准十进制表示法,您可以显示跳过货币的任何给定值,您可以单独处理该货币。

您需要使用以下格式设置货币/双倍格式:

 money.ToString("C", culture); 

困难的部分实际上是基于ISO代码获得正确的文化。 我不知道你如何跟踪你需要的文化。 请记住,这只是您的资金格式 ,而不是转换为不同的货币/文化!

更多详情:

ISOCurrencySymbol是RegionInfo的一部分,您可以根据CultureInfo创建,您可以从当前线程的文化设置中检索。 您应该创建一个实现字典的单例,以便从ISOCurrencyCode转换为CultureInfo。