Строка.Исключение форматирования, когда строка формата содержит “{”

StackOverflow https://stackoverflow.com/questions/1118529

  •  12-09-2019
  •  | 
  •  

Вопрос

Я использую VSTS 2008 + C # + .Net 2.0.При выполнении следующего оператора из String генерируется FormatException.Оператор Format, есть идеи, что не так?

Вот где можно получить template.html, который я использую.Я хочу отформатировать эту часть m= {0} в 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

ПРАВКА 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>

огромное спасибо, Джордж

Это было полезно?

Решение

Предположительно, html содержит javascript или другой источник фигурных скобок ({ и }), которые все нуждались бы в удвоении (чтобы {{ и }}) для использования с string.Format.Я ожидаю, что другой (более очевидный) токен может быть в порядке вещей, т.е. %%FILENAME%%.Затем используйте либо регулярное выражение, либо string.Replace.

Если у вас есть один тег, string.Replace все в порядке;если у вас их много, есть хитрости с регулярным выражением и MatchEvaluator это может быть полезно - вот так но с другим шаблоном регулярных выражений.


Обновление после добавления примера html:Я бы определенно использовал другой токен;на самом базовом уровне:

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

и

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

Другие советы

Ваш шаблон содержит { и } символы, которые нужно экранировать, иначе они сбивают с толку String.Format.Спасайтесь от них, используя {{ и }}.В качестве альтернативы используйте другой механизм, такой как String.Replace.

строка.Функция Format() не обрабатывает { и } в строке формата.Вам нужно заменить { с {{ и } с }} повсюду в вашем template.html файл.За исключением единственного места, где вы используете {0} плейсхолдер.

Не очень элегантно.

Вместо этого рассмотрите возможность использования шаблонизатора.Видишь http://csharp-source.net/open-source/template-engines за некоторые предложения.

Следующее лучшее решение - использовать регулярные выражения (с MatchEvaluator ) или string .Replace(), как предложено в других ответах.

Редактировать:

Вот пример использования шаблонизатора 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$ в шаблоне он заменяет его значением атрибута 'content', которое вы задаете с помощью кода.

Используя StringTemplate, вы можете выполнять простые циклы и условные обозначения внутри вашего шаблона.Видишь документация.

Каково содержимое переменной 'template'?

Трудно сказать, что не так с вашим кодом, но, по-видимому, переменная шаблона не содержит строку, которая используется в качестве заполнителя.(Например, "это некоторая строка {0}").

Я думаю, что вам следует воспользоваться инструментами, предоставляемыми вашей IDE:отладив код, используйте watches для проверки содержимого переменной шаблона.

Что находится в файле шаблона?

если есть фигурные скобки, которые не имеют формата {int}, или аргументов для оператора format больше, чем есть, это вызовет исключение.

Какое сообщение содержится в исключении?

Это делает ваш Css.Как упоминал кто-то еще, вам нужно будет заменить регулярное выражение или кучу строк.Команды замены в строке помечают ваши переменные %%ИМЯ_ПЕРЕМЕННОЙ%% и используют замену строки для их замены

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top