Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
480 views
in Technique[技术] by (71.8m points)

c# - How to use string.Format() to format a hex number surrounded by curly brackets?

Input: uint hex = 0xdeadbeef;

Required output: string result = "{deadbeef}"

First approach: Explicitly add the { and }; this works:

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

Output as decimal rather than hex using escaped curly brackets:

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

Seems promising, now all we need to do is add the :x hex specifer as per the first approach above:

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

Oh dear, adding the ':x has made it output "{x}" rather than the "{deadbeef}" that I wanted.

So my question is: Must I solve this by explicitly adding the { and } as per the first example, or is there a way to do it using composite formatting and escaping the curly brackets?

Also note that this also affects string interpolation which (after all) is just converted by the compiler into a call to string.Format().

(This may well be duplicate question, but I have been unable to find a duplicate so far...)

edited

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

See "Escaping Braces" in http://msdn.microsoft.com/en-us/library/txafckwd(v=vs.110).aspx - basically your workaround is a solution.

From there:

The way escaped braces are interpreted can lead to unexpected results. For example, consider the format item "{{{0:D}}}", which is intended to display an opening brace, a numeric value formatted as a decimal number, and a closing brace. However, the format item is actually interpreted in the following manner:

1.The first two opening braces ("{{") are escaped and yield one opening brace.
2. The next three characters ("{0:") are interpreted as the start of a format item.
3. The next character ("D") would be interpreted as the Decimal standard numeric format specifier, but the next two escaped braces ("}}") yield a single brace. Because the resulting string ("D}") is not a standard numeric format specifier, the resulting string is interpreted as a custom format string that means display the literal string "D}".
4. The last brace ("}") is interpreted as the end of the format item.
5. The final result that is displayed is the literal string, "{D}". The numeric value that was to be formatted is not displayed.

and as a solution, adjusted to your example:

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...