Как получить конкретную модель валюты культуры - PullRequest
20 голосов
/ 03 августа 2011

Как мне получить образец валюты для конкретной культуры?

Например:

Вместо использования:

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

Я хочу использовать это:

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

Но как мне получить строку шаблона (например, "#. ## 0,00 €; - #. ## 0,00 €") для каждой культуры, в которой нуждается мое приложение?

Я не могу использовать шаблон "{0: c}", потому что если пользователь переключает язык, валюта должна быть такой же.

Ответы [ 6 ]

22 голосов
/ 03 августа 2011

A CultureInfo содержит NumberFormatInfo, и этот класс описывает (среди прочего), как форматировать валюту для этой конкретной культуры.

В частности, вы можете использовать CurrencyPositivePattern и CurrencyNegativePattern для определенияесли символ валюты размещен до или после суммы и, конечно, CurrencySymbol, чтобы получить правильный символ валюты.Вся эта информация используется .NET, когда используется спецификатор формата C.

Подробнее о классе NumberFormatInfo можно прочитать в MSDN.

Код нижедемонстрирует некоторые шаги, необходимые для правильного форматирования валюты.Он использует только 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);
12 голосов
/ 03 августа 2011

Я думаю, что вы спрашиваете, как изменить символ валюты, но сохранить форматирование с учетом культурных особенностей Вы можете сделать это, получив копию текущего 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
3 голосов
/ 16 января 2014

Быстрый и грязный подход, который работает для всех числовых форматов:

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 €". Это позволяет избежать многих головных болей, пытаясь выяснить все перестановки. Я ценю задаваемый вопрос, так как он помог и заставил меня найти более простой ответ.

2 голосов
/ 03 августа 2011

Вы пробовали использовать string.Format("{0:N2} €", 345.10)?Это должно отформатировать до 2 десятичных знаков в культуре пользователей, за которыми следуют пробел и символ евро.

1 голос
/ 03 августа 2011

Вам необходимо отформатировать вашу валюту / удвоить, используя:

money.ToString("C", culture);

Сложной частью является получение правильной культуры на основе кода ISO. Я не знаю, как вы отслеживаете культуру, которая вам нужна. Имейте в виду, что это просто форматирование ваших денег, а не конвертация в различные валюты / культуры!

Подробнее:

ISOCurrencySymbol является частью RegionInfo, которую вы можете создать на основе CultureInfo, которую вы можете извлечь из настроек культуры вашего текущего потока. Вы должны создать синглтон, который реализует словарь для преобразования из ISOCurrencyCode в CultureInfo.

1 голос
/ 03 августа 2011

Тест ниже показывает, как этого добиться:

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

Используя стандартную десятичную запись из текущей выбранной культуры, вы можете отобразить любое заданное значение, пропуская валюту, которую вы можете обрабатывать отдельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...