number money ejemplo c# .net string.format

c# - money - String.Format excepción cuando la cadena de formato contiene "{"



string.format c# number (5)

Estoy utilizando VSTS 2008 + C # + .Net 2.0. Al ejecutar la siguiente declaración, hay una excepción FormatException desde la instrucción String.Format, ¿alguna idea de lo que está mal?

Aquí es donde obtener el template.html que estoy usando. Quiero formatear esta parte m = {0} en 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

EDITAR 1:

Aquí está el contenido de mi 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>

gracias en avdance, george


¿Cuáles son los contenidos de la variable ''plantilla''?

Es difícil decir qué hay de malo en tu código, pero, presumiblemente, la variable de la plantilla no contiene una cadena que sea un marcador de posición. (Como "esta es una cadena {0}").

Creo que debería hacer uso de las herramientas que proporciona su IDE: depurar el código, usar relojes para inspeccionar el contenido de la variable de la plantilla.


¿Qué hay en el archivo de plantilla?

si hay llaves que no tienen el formato {int} o hay más argumentos para la declaración de formato, se producirá una excepción.

¿Cuál es el mensaje en la excepción?

Es tu Css que lo está haciendo. Como ya se mencionó en otra parte, deberá hacer una sustitución de expresiones regulares o un grupo de comandos String.Replace en una fila que marque sus variables con %% VARIABLE_NAME %% y usar el reemplazo de cadenas para reemplazarlos


En una conjetura, el html contiene javascript u otra fuente de llaves ( { y } ) que todos necesitarían duplicarse (a {{ y }} ) para poder utilizarse con string.Format . Espero que un token diferente (más obvio) esté en orden, es decir, %%FILENAME%% . Luego use regex o string.Replace . string.Replace .

Si tiene una sola etiqueta, string.Replace está bien; Si tienes muchos, hay trucos con MatchEvaluator regulares y MatchEvaluator que pueden ser útiles, como así, pero con un patrón de expresiones regulares diferente.

Actualización después del ejemplo html agregado: Definitivamente usaría un token diferente; En el nivel más básico:

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

y

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


Su plantilla contiene { y } caracteres que deben escaparse, de lo contrario, confunden String.Format . Escápalos usando {{ y }} . Alternativamente, utilice un mecanismo diferente, como String.Replace .


string.Format () no maneja { y } en la cadena de formato. Debe reemplazar { por {{ y } con }} en todas partes en su archivo template.html . Excepto en el lugar único donde utiliza el marcador de posición {0} .

No muy elegante.

En su lugar, considere utilizar un motor de plantilla. Consulte http://csharp-source.net/open-source/template-engines para obtener algunas sugerencias.

La siguiente mejor solución es usar expresiones regulares (con MatchEvaluator) o string.Replace (), como lo sugieren otras respuestas.

Editar:

Aquí hay un ejemplo utilizando el motor de plantillas StringTemplate:

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

Cambie una sola línea en su archivo template.html :

de:

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

a:

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

Cuando el motor de plantillas encuentra $content$ en la plantilla, la reemplaza con el valor del atributo ''contenido'' que establece mediante el uso del código.

Usando StringTemplate, puedes hacer simples bucles y condicionales dentro de tu plantilla. Consulte la documentación .