Как получить строку формата для указанной валюты и культуры - PullRequest
0 голосов
/ 24 октября 2019

У меня есть отчеты SSRS, которые отображают суммы в валюте. Они должны знать культуру и валюту. Некоторые отчеты показывают разные валюты в одной таблице. У меня нет проблем с осознанием культуры. Проблема в форматировании валюты. Важно, что при экспорте в Excel значения в этих валютных полях должны сортироваться как числа. Это означает, что значения ячеек должны быть числами, поэтому я не могу использовать обычные функции .ToString ("C", culture), которые заканчиваются многими другими сообщениями. Мне нужно сохранить числовое значение в поле и применитьСтрока формата .NET для числа (например, «$», 0,00; («$», 0,00) »). Таким образом, Excel будет обрабатывать значение как число для целей сортировки, но отображать правильно отформатированную валюту.

Можно ли использовать код для изменения экземпляра NumberFormatInfo, а затем каким-то образом вернуть строковое значение средства форматирования, напримеркак "€" #, 0,00; ('€' #, 0,00) "?

var numberFormat = new CultureInfo("en-US").NumberFormat;
numberFormat.CurrencySymbol = "€";
return numberFormat.GetCurrencyFormatString(); //this is an imaginary function that I need to return "'€'#,0.00;('€'#,0.00)"

Я попытался программно установить символ валюты на основе информации о валюте каждой строки. Насколько я знаю, SSRS не позволяет мне использовать выражение для установки символа валюты. Он предлагает только выпадающий список.

Моим пользователям не нравится, когда я показываю код валюты (например, USD, CAD), поэтому я застрял с отображением символа (например, $, CA $).

1 Ответ

0 голосов
/ 25 октября 2019

Насколько я могу судить, вам нужно будет вручную создать эту строку формата, используя класс CultureInfo.

Используя документы на CurrencyPositivePattern и CurrencyNegativePattern (см. здесь и здесь ), я собрал что-то, что работает, но может потребоваться некоторая настройка:

string GetCurrencyFormat(CultureInfo culture)
{            
    //we'll use string.Format later to replace {0} with the currency symbol
    //and {1} with the number format
    string[] negativePatternStrings = { "({0}{1})", "-{0}{1}", "{0}-{1}", "{0}{1}-", "({1}{0})",
                            "-{1}{0}", "{1}-{0}", "{1}{0}-", "-{1} {0}", "-{0} {1}",
                            "{1} {0}-", "{0} {1}-", "{0} -{1}", "{1}- {0}", "({0} {1})",
                            "({1} {0})" };
    string[] positivePatternStrings = { "{0}{1}", "{1}{0}", "{0} {1}", "{1}{0}" };

    var numberFormat = culture.NumberFormat;

    //Generate 0's to fill in the format after the decimal place
    var decimalPlaces = new string('0', numberFormat.CurrencyDecimalDigits);

    //concatenate the full number format, e.g. #,0.00
    var fullDigitFormat = $"#{numberFormat.CurrencyGroupSeparator}0{numberFormat.CurrencyDecimalSeparator}{decimalPlaces}";

    //use string.Format on the patterns to get the positive and 
    //negative formats
    var positiveFormat = string.Format(positivePatternStrings[numberFormat.CurrencyPositivePattern],  
                                       numberFormat.CurrencySymbol, fullDigitFormat);
    var negativeFormat = string.Format(negativePatternStrings[numberFormat.CurrencyNegativePattern], 
                                       numberFormat.CurrencySymbol, fullDigitFormat);

    //finally, return the full format
    return $"{positiveFormat};{negativeFormat}";
}

Это возвращает $#,0.00;($#,0.00) для en-US, £#,0.00;-£#,0.00 дляen-GB, например.

...