Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

String.Format exception when format string contains "{"

I am using VSTS 2008 + C# + .Net 2.0. When executing the following statement, there is FormatException thrown from String.Format statement, any ideas what is wrong?

Here is where to get the template.html I am using. I want to format this part m={0} in template.html.

    string template = String.Empty;     using (StreamReader textFile = new StreamReader("template.html"))     {         template = textFile.ReadToEnd();         String.Format(template, "video.wmv");     } 

http://www.mediafire.com/download.php?u4myvhbmmzg

EDIT 1:

Here is the content for my template.html,

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <!-- saved from url=(0014)about:internet --> <head>     <title>Silverlight Project Test Page </title>      <style type="text/css">     html, body {         height: 100%;         overflow: auto;     }     body {         padding: 0;         margin: 0;     }     #silverlightControlHost {         height: 100%;     }     </style>      <script type="text/javascript">         function onSilverlightError(sender, args) {              var appSource = "";             if (sender != null && sender != 0) {                 appSource = sender.getHost().Source;             }              var errorType = args.ErrorType;             var iErrorCode = args.ErrorCode;              var errMsg = "Unhandled Error in Silverlight 2 Application " +  appSource + "\n" ;              errMsg += "Code: "+ iErrorCode + "    \n";             errMsg += "Category: " + errorType + "       \n";             errMsg += "Message: " + args.ErrorMessage + "     \n";              if (errorType == "ParserError")             {                 errMsg += "File: " + args.xamlFile + "     \n";                 errMsg += "Line: " + args.lineNumber + "     \n";                 errMsg += "Position: " + args.charPosition + "     \n";             }             else if (errorType == "RuntimeError")             {                            if (args.lineNumber != 0)                 {                     errMsg += "Line: " + args.lineNumber + "     \n";                     errMsg += "Position: " +  args.charPosition + "     \n";                 }                 errMsg += "MethodName: " + args.methodName + "     \n";             }              throw new Error(errMsg);         }     </script> </head>  <body>     <!-- Runtime errors from Silverlight will be displayed here.     This will contain debugging information and should be removed or hidden when debugging is completed -->     <div id='errorLocation' style="font-size: small;color: Gray;"></div>      <div id="silverlightControlHost">         <object data="data:application/x-silverlight," type="application/x-silverlight-2" width="500" height="240">             <param name="source" value="ClientBin/VideoPlayer.xap"/>             <param name="onerror" value="onSilverlightError" />             <param name="background" value="white" />             <param name="initParams" value="cc=true,markers=true,m={0}" />             <a href="http://go.microsoft.com/fwlink/?LinkID=115261" style="text-decoration: none;">                 <img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight" style="border-style: none"/>             </a>         </object>         <iframe style='visibility:hidden;height:0;width:0;border:0px'></iframe>     </div> </body> </html> 

thanks in avdance, George

like image 899
George2 Avatar asked Jul 13 '09 09:07

George2


People also ask

What is %s in string format?

The %s operator is put where the string is to be specified. The number of values you want to append to a string should be equivalent to the number specified in parentheses after the % operator at the end of the string value.

What is %s format in Java?

%s in the format string is replaced with the content of language . %s is a format specifier. Similarly, %x is replaced with the hexadecimal value of number in String. format("Number: %x", number) .


2 Answers

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"); 
like image 150
Marc Gravell Avatar answered Sep 30 '22 19:09

Marc Gravell


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.

like image 23
Matt Howells Avatar answered Sep 30 '22 20:09

Matt Howells