Как использовать string.Format() для форматирования шестнадцатеричного числа, окруженного фигурными скобками?
Вход: uint hex = 0xdeadbeef;
Требуемый вывод: string result = "{deadbeef}"
Первый подход: явно добавьте {
и }
; это работает:
result = "{" + string.Format("{0:x}", hex) + "}"; // -> "{deadbeef}"
Вывод как десятичный, а не шестнадцатеричный с использованием экранированных фигурных скобок:
result = string.Format("{{{0}}}", hex); // -> "{3735928559}"
Кажется многообещающим, теперь все, что нам нужно сделать, это добавить спецификатор hex :x
в соответствии с первым подходом выше:
result = string.Format("{{{0:x}}}", hex); // -> "{x}"
О, дорогая, добавив ':x
, он сделал вывод "{x}"
, а не "{deadbeef}"
, который я хотел.
Итак, мой вопрос: должен ли я решить это, явно добавив {
и }
в соответствии с первым примером, или есть способ сделать это, используя сложное форматирование и избегая фигурных скобок?
Также обратите внимание, что это также влияет на интерполяцию строк, которая (в конце концов) просто преобразуется компилятором в вызов string.Format()
.
(Возможно, это повторяющийся вопрос, но до сих пор мне не удалось найти дубликат...)
отредактированный
Ответы
Ответ 1
См. "Съемка брекетов" в http://msdn.microsoft.com/en-us/library/txafckwd(v=vs.110).aspx - в основном ваше обходное решение - это решение.
Оттуда:
То, как интерпретируются скрытые фигурные скобки, может привести к неожиданным результатам. Например, рассмотрим элемент формата "{{{0: D}}}", который предназначен для отображения открывающей скобки, числовое значение, отформатированное как десятичное номер и закрывающая скобка. Однако элемент формата на самом деле интерпретируется следующим образом:
1. Первые две открывающиеся фигурные скобки ( "{{" ) сбрасываются и дают одну открывающую скобу.
2. Следующие три символа ( "{0:" ) интерпретируются как начало элемента формата.
3. Следующий символ ( "D" ) будет интерпретироваться как десятичный стандарт числовой формат, но следующие две скошенные скобки ( "}}" ) дают единственная фигурная скобка. Поскольку результирующая строка ( "D" ) не является стандартом спецификатор числового формата, результирующая строка интерпретируется как строка пользовательского формата, которая отображает буквенную строку "D" ".
4. Последняя скобка (" } ") интерпретируется как конец элемента формата.
5. Конечным результатом, который отображается, является буквальная строка" {D}". числовое значение, которое должно было быть отформатировано, не отображается.
и как решение, скорректированное на ваш пример:
uint hex = 0xdeadbeef;
string output = string.Format("{0}{1:x}{2}",
"{", hex, "}");
Console.WriteLine(output);
Ответ 2
Ближе всего я получил
string.Format("{{{0:x}\u200B}}",16)
Похоже, что}}} интерпретируется неправильно, вставка пространства с нулевой шириной предотвращает распространение первых двух символов в качестве экранированного символа}.
Ответ 3
Вы можете использовать пустой символ или добавить скобки в качестве аргументов:
uint hex = 0xdeadbeef;
string result = string.Format("{0}{1:x}{2}", "{", hex, "}");
Это приведет к выходу {deadbeef}
по вашему желанию.
Это происходит потому, что для вывода } в string.Format вам нужно выполнить его как }}.
Но когда вы вводите }}}
, он понимает это как }} }
и выводит {x}
. Это ошибка дизайна на С#, когда вы пытаетесь форматировать свой вывод, например :x
, :N
или еще.
Вы также можете попробовать
uint hex = 0xdeadbeef;
string result = string.Format("{{ {1:x} }}", hex);
Но это выведет вас { deadbeef }
с пробелами.
Ответ 4
Попробуйте следующее: Используйте 2 раза String.Format
Метод, подобный этому
String result= String.Format("{{{0}}}",String.Format("{0:x}", hex));