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

时间:2011-08-03 09:07:34

标签: c# string format currency

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

例如:

而不是使用:

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

我想用这个:

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

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

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

7 个答案:

答案 0 :(得分:21)

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

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

您可以在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);

答案 1 :(得分:11)

我认为您要问的是如何更改货币符号,但保留特定于文化的格式。您可以通过获取当前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

答案 2 :(得分:3)

适用于所有数字格式的快速而肮脏的方法是:

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

答案 3 :(得分:2)

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

答案 4 :(得分: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));
    }

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

答案 5 :(得分:1)

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

money.ToString("C", culture);

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

更多细节:

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

答案 6 :(得分:0)

对于正数和负数,可以将以下代码段用于文化

class Program
{
    static void Main(string[] args)
    {
        List<string> cultures = new List<string> { "ca-ES", "co-FR", "cs-CZ", "cy-GB", "da-DK", "de-AT", "de-CH", "de-DE", "de-LI", "de-LU", "dsb-DE", "en-US", "en-GB" };

        var amount = -16.34M;

        foreach (var c in cultures)
        {
            var cultureInfo = CultureInfo.GetCultureInfo(c);

            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 if (amount < Decimal.Zero)
            {
                String pattern = null;
                switch (numberFormat.CurrencyNegativePattern)
                {
                    case 0:
                        pattern = "({0}{1:N" + numberFormat.CurrencyDecimalDigits + "})";
                        break;
                    case 1:
                        pattern = numberFormat.NegativeSign + "{0}{1:N" + numberFormat.CurrencyDecimalDigits + "}";
                        break;
                    case 2:
                        pattern = "{0}" + numberFormat.NegativeSign + "{1:N" + numberFormat.CurrencyDecimalDigits + "}";
                        break;
                    case 3:
                        pattern = "{0}{1:N" + numberFormat.CurrencyDecimalDigits + "}" + numberFormat.NegativeSign;
                        break;
                    case 4:
                        pattern = "({1:N" + numberFormat.CurrencyDecimalDigits + "}{0})";
                        break;
                    case 5:
                        pattern = numberFormat.NegativeSign + "{1:N" + numberFormat.CurrencyDecimalDigits + "}{0}";
                        break;
                    case 6:
                        pattern = "{1:N" + numberFormat.CurrencyDecimalDigits + "}" + numberFormat.NegativeSign + "{0}";
                        break;
                    case 7:
                        pattern = "{1:N" + numberFormat.CurrencyDecimalDigits + "}{0}" + numberFormat.NegativeSign;
                        break;
                    case 8:
                        pattern = numberFormat.NegativeSign + "{1:N" + numberFormat.CurrencyDecimalDigits + "} {0}";
                        break;
                    case 9:
                        pattern = numberFormat.NegativeSign + "{0} {1:N" + numberFormat.CurrencyDecimalDigits + "}";
                        break;
                    case 10:
                        pattern = "{1:N" + numberFormat.CurrencyDecimalDigits + "} {0}" + numberFormat.NegativeSign;
                        break;
                    case 11:
                        pattern = "{0} {1:N" + numberFormat.CurrencyDecimalDigits + "}" + numberFormat.NegativeSign;
                        break;
                    case 12:
                        pattern = "{0}" + " " + numberFormat.NegativeSign + "{1:N" + numberFormat.CurrencyDecimalDigits + "}";
                        break;
                    case 13:
                        pattern = "{1:N" + numberFormat.CurrencyDecimalDigits + "}" + numberFormat.NegativeSign + " " + "{0}";
                        break;
                    case 14:
                        pattern = "({0} {1:N" + numberFormat.CurrencyDecimalDigits + "})";
                        break;
                    case 15:
                        pattern = "({1:N" + numberFormat.CurrencyDecimalDigits + "} {0})";
                        break;
                }
                formattedAmount = String.Format(cultureInfo, pattern, numberFormat.CurrencySymbol, amount * -1);
            }

            Console.WriteLine(formattedAmount);
        }

        Console.ReadKey();

    }
}