String.Format exception when format string contains “{”

流过昼夜 提交于 2019-11-27 13:54:21
Marc Gravell

At a guess, the html contains javascript or another source of braces ({ and }) which would all need doubling (to {{ and }}) to be usable with string.Format. I expect a different (more obvious) token may be in order, i.e. %%FILENAME%%. Then use either regex or string.Replace.

If you have a single tag, string.Replace is fine; if you have lots, there are tricks with regex and MatchEvaluator that may be helpful - like so but with a different regex pattern.


Update after the example html added: I would definitely use a different token; at the most basic level:

<param name="initParams" value="cc=true,markers=true,m=%%FILENAME%%" />

and

template = template.Replace("%%FILENAME%%", "video.wmv");

Your template contains { and } characters which need to be escaped, otherwise they confuse String.Format. Escape them using {{ and }}. Alternatively, use a different mechanism such as String.Replace.

string.Format() does not handle { and } in the format string. You need to replace { with {{ and } with }} everywhere in your template.html file. Except for the single place where you use the {0} placeholder.

Not very elegant.

Instead, consider using a template engine. See http://csharp-source.net/open-source/template-engines for some suggestions.

The next-best solution is to use regexes (with MatchEvaluator) or string.Replace(), as suggested by other answers.

Edit:

Here's an example using the StringTemplate template engine:

StringTemplate htmlpage = new StringTemplate(File.ReadAllText("template.html"));
htmlpage.SetAttribute("content", "video.wmv");
Console.WriteLine(htmlpage.ToString());

Change a single line in your template.html file:

from:

<param name="initParams" value="cc=true,markers=true,m={0}" />

to:

<param name="initParams" value="cc=true,markers=true,m=$content$" />

When the template engine encounters $content$ in the template, it replaces it with the value of the 'content' attribute that you set using code.

Using StringTemplate, you can do simple looping and conditionals within your template. See the documentation.

Wat are the contents of the 'template' variable ?

Difficult to say what 's wrong with your code, but presumably, the template variable does not contain a string which as a place-holder. (Like "this is some string {0}").

I think that you should make use of the tools your IDE provides: debug the code, use watches to inspect the contents of the template variable.

Whats in the template file?

if there are curly brackets that are not of the format {int} or there are more than there are arguments for the format statement, it'll throw an exception.

What is the message in the exception?

It's your Css thats doing it. As somoene else mentioned you'll need to doa regex replace, or a bunch of String.Replace commands in a row mark you variables with %%VARIABLE_NAME%% and use string replacement to replace them

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!