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

Как использовать 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().

(Возможно, это повторяющийся вопрос, но до сих пор мне не удалось найти дубликат...)

отредактированный

4b9b3361

Ответ 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));