フォーマット文字列が「{」が含まれているString.Formatの例外
-
12-09-2019 - |
質問
私はVSTS 2008 + C#+ .NET 2.0を使用しています。次の文を実行すると、FormatException String.Formatの声明そこからスローされ、任意のアイデアは、何が間違っているのですか?
私が使用していますtemplate.htmlを取得するために、ここで、ここにあります。 Iはtemplate.htmlこの部分M = {0}をフォーマットする。
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:
ここに私の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>
avdanceでおかげで、 ジョージ
解決
の推測では、HTMLはすべて{
と共に使用可能であること(}
と{{
する)倍加必要があるブレース(}}
とstring.Format
)のJavaScriptまたは別のソースを含んでいます。私は異なる(より明白な)トークンが、即ち%%FILENAME%%
順序であってもよい期待します。その後、正規表現またはstring.Replace
のいずれかを使用します。
、string.Replace
で結構です。 そうのような、異なる正規表現パターンを持つ - あなたは多くを持っている場合、役に立つかもしれ正規表現とMatchEvaluator
とのトリックがあります。
アップデート後:私は間違いなく別のトークンを使用します。最も基本的なレベルでます:
<param name="initParams" value="cc=true,markers=true,m=%%FILENAME%%" />
と
template = template.Replace("%%FILENAME%%", "video.wmv");
他のヒント
あなたのテンプレートは、そうでない場合、彼らは{
を混同し、エスケープする必要が}
とString.Format
文字が含まれています。 {{
と}}
を使用してそれらをエスケープします。あるいは、そのようなString.Replace
ような異なるメカニズムを使用します。
String.Formatの()は、書式文字列内{
と}
を処理しません。あなたの{
ファイル内のどこにでも{{
で}
と}}
でtemplate.html
を交換する必要があります。あなたは{0}
プレースホルダを使用し、単一の場所を除いて。
非常にエレガントされていません。
その代わり、テンプレートエンジンを使用することを検討してください。 http://csharp-source.net/open-source/template-enginesを参照してください。 A>いくつかの提案のため。
次の最良の解決策は、他の回答によって示唆されるように、またはstring.Replace()(MatchEvaluatorで)正規表現を使用することである。
の編集の
ここでStringTemplateテンプレートエンジンを使用した例です。
StringTemplate htmlpage = new StringTemplate(File.ReadAllText("template.html"));
htmlpage.SetAttribute("content", "video.wmv");
Console.WriteLine(htmlpage.ToString());
あなたのtemplate.html
ファイル内の単一の行を変更します:
から
<param name="initParams" value="cc=true,markers=true,m={0}" />
と
<param name="initParams" value="cc=true,markers=true,m=$content$" />
テンプレートエンジンは、テンプレートで$content$
に遭遇すると、、それはあなたがコードを使用して設定する「コンテンツ」属性の値に置き換えます。
StringTemplateを使用して、あなたのテンプレート内の単純なループや条件文を行うことができます。 ドキュメントを参照してください。
ワット・「テンプレート」変数の内容は?
難しい「はあなたのコードで間違っては何と言ってますが、おそらく、テンプレート変数はプレースホルダとして文字列が含まれていません。 ( "これは、いくつかの文字列{0}である" など)。
私はあなたのIDEが提供するツールを利用すべきだと思う:コードをデバッグ、テンプレート変数の内容を検査するために時計を使用
。いただきましたテンプレートファイルで?
形式{int型}ではないか、FORMAT文の引数がある以上ある中括弧がある場合は、、それが例外をスローします。
例外ではメッセージは何ですか?
これはあなたのCSSのthatsはそれをやってます。 somoene他には、前述のように、
それらを交換するために、あなたは置き換えるDOAの正規表現する必要があります、またはString.Replaceの束は%% %% VARIABLE_NAMEと使用文字列置換を持つあなたは、変数行マークにコマンド