Подтвердить что ты не робот

Как получить конкретную валюту валюты культуры

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

Пример:

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

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

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

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

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

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

4b9b3361

Ответ 1

A CultureInfo содержит a 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);

Ответ 2

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

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

Ответ 4

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

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

Ответ 5

Нижеприведенный тест иллюстрирует, как вы можете это сделать:

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

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

Ответ 6

Вам нужно отформатировать свою валюту/двойную, используя:

money.ToString("C", culture);

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

Подробнее:

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