Как конвертировать между строковыми представлениями в стиле “#,##0” и “{0: n2}”?
-
05-09-2019 - |
Вопрос
.NET поддерживает два типа форматирования строк.
Я нахожусь в ситуации, когда существующие конфигурационные данные имеют #,##0
форматирование стиля.Новая функция требует форматирования для того же вывода, но API, необходимый для этой функции, принимает форматирование только типа {0:n2}
.
Кто-нибудь знает о способе преобразования между этими двумя представлениями для числовых типов? DateTime
может быть проигнорирован.
Редактировать Я научился этому:
В
{0:n2}
стиль известен как стандартное числовое форматированиеВ
#,##0
стиль известен как пользовательское числовое форматирование
Решение
Нет, ты не можешь.
От вашего ссылка на статьи MSDN о стандартном формате струны, вы найдете:
Фактический шаблон отрицательных чисел, размер группы чисел, разделитель тысяч, и десятичный разделитель задаются текущим объектом NumberFormatInfo.
Таким образом, стандартные спецификаторы форматирования будут варьироваться в зависимости от того, в какой среде работает программа.
Поскольку ваше пользовательское форматирование точно определяет, как будет выглядеть число, независимо от культуры, в которой работает программа.Это всегда будет выглядеть одинаково.
Язык, в котором выполняется программа, неизвестен во время компиляции, это свойство среды выполнения.
Итак, ответ таков:Нет, вы не можете сопоставить автоматически, потому что не существует однозначного согласованного сопоставления.
Другие советы
ПРЕДУПРЕЖДЕНИЕ О ВЗЛОМЕ!!!
Как Арджан указал в своем превосходном ответе то, что я хочу сделать, невозможно пуленепробиваемым способом во всех регионах (спасибо Арджану).
Для моих целей я знаю, что имею дело только с числами, и главное, что меня беспокоит, - это одинаковое количество знаков после запятой.Итак, вот мой взлом.
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 + "}";
}
Это используется для форматирования числа в 2 знака после запятой
string s = string.Format("{0:N2}%", x);