Как преобразовать строковые представления в формате "#, ## 0" и "{0: n2}"? - PullRequest
0 голосов
/ 20 февраля 2009

.NET поддерживает два типа форматирования строк.

Я нахожусь в ситуации, когда существующие данные конфигурации имеют форматирование #,##0. Новая функция требует форматирования для того же вывода, но API, необходимый для этой функции, принимает только форматирование типа {0:n2}.

Кто-нибудь знает способ преобразования между этими двумя представлениями для числовых типов? DateTime можно игнорировать.

РЕДАКТИРОВАТЬ Я узнал, что:

Ответы [ 3 ]

2 голосов
/ 20 февраля 2009

Нет, вы не можете.

Из ссылки на статьи MSDN о стандартном формате строк вы найдете:

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

Таким образом, стандартные спецификаторы форматирования будут различаться в зависимости от того, под какой культурой работает программа.

Поскольку ваше пользовательское форматирование точно определяет, как будет выглядеть число, независимо от того, под какой культурой работает программа. Он всегда будет выглядеть одинаково.

Культура, в которой работает программа, неизвестна во время компиляции, это свойство времени выполнения.

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

0 голосов
/ 07 марта 2016

Используется для форматирования числа в 2 десятичных знака

string s = string.Format("{0:N2}%", x);
0 голосов
/ 20 февраля 2009

HACK ALERT !!!

Как Арджан указал в своем превосходном ответе , то, что я хочу сделать, невозможно пуленепробиваемым способом во всех регионах (спасибо Арджан).

Для моих целей я знаю, что имею дело только с числами, и главное, что меня интересует, - это одинаковое количество десятичных знаков. Так вот мой хак.

private static string ConvertCustomToStandardFormat(string customFormatString)
{
    if (customFormatString == null || customFormatString.Trim().Length == 0)
        return null;

    // Percentages do not need decimal places
    if (customFormatString.EndsWith("%"))
        return "{0:P0}";

    int decimalPlaces = 0;

    int dpIndex = customFormatString.LastIndexOf('.');
    if (dpIndex != -1)
    {
        for (int i = dpIndex; i < customFormatString.Length; i++)
        {
            if (customFormatString[i] == '#' || customFormatString[i] == '0')
                decimalPlaces++;
        }
    }

    // Use system formatting for numbers, but stipulate the number of decimal places
    return "{0:n" + decimalPlaces + "}";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...