2016-10-13 3 views
13

Вход:uint hex = 0xdeadbeef;Как использовать string.Format() для форматирования шестнадцатеричного числа, окруженного фигурными скобками?

Требуемая мощность:string result = "{deadbeef}"

Первый подход: Явное добавить { и }; это работает:

result = "{" + string.Format("{0:x}", hex) + "}"; // -> "{deadbeef}" 

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

result = string.Format("{{{0}}}", hex); // -> "{3735928559}" 

Кажется перспективным, теперь все, что нам нужно сделать, это добавить :x шестигранную specifer в соответствии с первым подходом выше:

result = string.Format("{{{0:x}}}", hex); // -> "{x}" 

Ах, добавив ':x сделал выход "{x}", а не "{deadbeef}", что я хотел.

Так что мой вопрос: должен ли я решить это, явно добавив { и } в соответствии с первым примером, или есть способ сделать это, используя сложное форматирование и избегая фигурных скобок?

Также обратите внимание, что это также влияет на интерполяцию строк, которая (в конце концов) просто преобразуется компилятором в вызов string.Format().

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

отредактировал

+1

См "Экранирование брекеты" в https://msdn.microsoft.com/en-us/library/txafckwd(v=vs. 110) .aspx - в основном ваше решение - это решение. –

+0

Это похоже на ошибку в 'string.Format'. –

+0

@HansKesting Эта статья на самом деле является ответом на этот вопрос. Если вы опубликуете его в качестве ответа, я буду отмечать его как правильное. –

ответ

7

См "Спасаясь Подтяжки" в 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); 
3

Ближайший я получил это

string.Format("{{{0:x}\u200B}}",16) 

Кажется, что }}} интерпретируется неправильно, вставка пространства с нулевой шириной предотвращает распространение первых двух символов в качестве экранированного символа}.

2

Вы можете использовать пустой символ или добавить скобки в качестве аргументов:

uint hex = 0xdeadbeef; 
string result = string.Format("{0}{1:x}{2}", "{", hex, "}"); 

Это выведет вас {deadbeef} как вы хотели.

Это происходит потому, что для вывода } в string.Format вы должны избежать этого, как этот }}.

Но когда вы вводите }}}, он понимает это как }} } и выдает {x}. Это ошибка дизайна в C#, когда вы пытаетесь форматировать свой вывод, например :x, :N или еще.

Вы также можете попробовать

uint hex = 0xdeadbeef; 
string result = string.Format("{{ {1:x} }}", hex); 

Но это будет выводить вас { deadbeef } с пробелами.

+1

Это ошибка в 'string.Format', а не C#. –

+0

@ LasseV.Karlsen Какая существенная разница? – cat

+0

Посмотрите мои комментарии к вопросу. –

2

Попробуйте это: Используйте 2 раза String.Format метод, как этот

String result= String.Format("{{{0}}}",String.Format("{0:x}", hex)); 
+0

Не нужно форматировать параметр, тогда вы можете использовать 'hex.ToString (" x ")'. – CodeCaster

+0

@CodeCaster какой op ищет оболочку этой шестнадцатеричной строки в фигурные скобки '{deadbeef}' –

+0

Вам не хватает точки. Вместо 'String.Format (" {0: x} ", hex)' можно просто использовать 'hex.ToString (" x ")'. – CodeCaster