2014-09-24 2 views
-3

을하는 동안 변수에 문자를 무시하는 방법은 예를 다음에 사용자 추가 텍스트가 포함 된 실패에 대한 이유라는 문자열 변수가 }} (82) 키트는, 및 String.format

이제이 변수는 string.format을 사용하는 메소드의 일부입니다. 위 변수의 텍스트에서 {0} {1}과 혼동하지 않도록 string.format이 필요합니다. 예외가 발생했습니다. 입력 문자열의 형식이 올바르지 않습니다.

+1

이 중복인가? http://stackoverflow.com/questions/91362/how-to-escape-braces-curly-brackets-in-a-format-string-in-net –

+0

단일 문자열을 사용하여이 작업을 수행 할 수 있습니까? 형식 ...? – MethodMan

+1

예, 바깥 쪽의'string.Format'은 아무 것도하지 않습니다. –

답변

1

문제는 변수 serviceEntry.ReasonForFailureformat item이 포함되어 있다는 것입니다. 형식 항목으로 취급하지 않으려면 여분의 중괄호를 사용하여 이스케이프 처리해야합니다. 예를 들어, {0}here으로 설명한 {{0}}이됩니다.

문제에 신속하고 더러운 솔루션은 이중 중괄호 모든 개폐 괄호를 대체하는 것입니다 :

"Reason For Failure:" + serviceEntry.ReasonForFailure.Replace("{","{{").Replace("}","}}") + "<br/>" 

더 나은 솔루션은 정규 표현식을 사용하여 교체 할 것 :

public string EscapeCurlyBraces(string value) 
{ 
    string strRegex = @"(\{\d+\})"; 
    Regex myRegex = new Regex(strRegex, RegexOptions.None); 
    string strReplace = @"{$1}"; 

    return myRegex.Replace(value, strReplace); 
} 

그리고는 다음과 같이 사용 :

"Reason For Failure:" + EscapeCurlyBraces(serviceEntry.ReasonForFailure) + "<br/>" 

업데이트 나는 현재 솔루션을 도랑 사용하여 다시 제안 StringBuilder :

var emailBody = new StringBuilder(); 
emailBody.Append("<html><body>RSLMS - Service Request is complete<br/>"); 
emailBody.Append("Service Request initiated by you is Complete <br/>"); 
emailBody.AppendFormat("Please use the following link to access Run Log Entry <a href=\"{0}{1}\">{0}{1}</a><br/>", RunLogURL, runLogID); 
// ommited some lines 
emailBody.AppendFormat("Service ID: {0}<br/><br/>", serviceEntry.ID.ToString()); 
// ommited some lines 
emailBody.AppendFormat("Reason For Failure: {0}<br/><br/>", serviceEntry.ReasonForFailure); 
emailBody.Append("Thank you <br/> RSLMS Administrator <br/></body></html>");   

message.Body = emailBody.ToString(); 
+0

글쎄 그 사용자가 텍스트를 추가했기 때문에 항상 그 캐릭터를 추가하거나 다른 새로운 캐릭터를 추가 할 것이라고 확신하지는 못했습니다. :) 난 그 변수를 추가하는 그들을 막을 수있는 텍스트 상자에 몇 가지 자바 스크립트를 적용 할 수 있지만 나는이 값을 데이터베이스 열에 저장하는 데 문제가 없습니다. 문제는 내가 이메일을 작성하는 방식에서만 발생합니다. 나는 당신의 해결책을 시험하고 있습니다, 도움이 될 것 같습니다 –

+0

이 새로운 정보를 주면 당신의 해결책은 결함이 있습니다. HTML 메일에 사용자 생성 텍스트를 삽입하려면 해당 문자열을 HTML로 인코딩해야합니다. 그리고 SQL 삽입으로부터 데이터베이스를 보호하기를 바랍니다. – venerik

+0

메시지 본문을 포맷하기 전에 문자열을 인코딩해야합니까? 나는 그것을 시도하고 여전히 같은 오류] –

0

두 개의 String.Format이 있으므로 제공하지 못했습니다. 외부 변수에 대한 매개 변수, 외부 형식에 대해 x 및 y라고 가정합니다. 필요한 작업입니다. 당신은 당신 같이 내부 형식에서 탈출하려는 사람들을 위해 이중 중괄호를 할 필요가 : 당신이 예외를 받고있어

var reasonForFailure = "({{0}}) on arm ({{1}}) (82) Kits should still have 50 tests left after run, but it seems like the instrument is not able to pipette anymore from the kits."; 
      var message = string.Format(string.Format(
            "<html><body>Request is complete<br/>" + 
            "Service Request initiated by you is Complete" + " <br/> " + 
            "Please use the following link to access <a href=\"{0}{1}\">{0}{1}</a> <br/>" + 
            "Reason For Failure: " + reasonForFailure+"<br/>" + 
            "</body></html>", RunLogURL, runLogID),x,y); 
2

이유, The input string is not in the correct format는 문자열을 구성하고있는 방식 때문이다. 변수에는 두 개의 닫는 중괄호가 있습니다. 여기서 string.Format은 하나만 예상됩니다 : on arm ({1}}. 아래의 첫 번째 예와 같이이 변수를 String.Format의 매개 변수로 추가하면이 문제가 해결됩니다.

그렇지 않으면, 당신은 변수 serviceEntry.ReasonForFailure{0}{1}이, 그리고 당신은 String.Format 내에서이 변수를 배치 할 때, 그 문자가 String.Format 인수로 대체되고 있음을, 다음이 적어도 설계된 문자를 포함 말하는 경우 당신이 당신의 문자열을 만드는 방식.

+ 연산자를 사용하여 문자열에 변수를 삽입하는 대신 String.Format 호출에 다른 매개 변수로 포함하십시오. 이렇게하면 변수에 {0}이 보존됩니다.

message.Body = string.Format(
    "<html><body>Request is complete<br/>" + 
    "Service Request initiated by you is Complete<br/>" + 
    "Please use the following link to access " + 
    "<a href=\"{0}{1}\">{0}{1}</a><br/>" + 
    "Reason For Failure: {2}<br/></body></html>", 
    RunLogURL, runLogID, serviceEntry.ReasonForFailure); 

지금, 당신은 다른 값으로 serviceEntry.ReasonForFailure{0}{1}를 교체하려는 경우, 중첩 할 수 다른 내부 및 String.format :

serviceEntry.ReasonForFailure = "10003 Insufficient Liquid Level detected at " + 
    "pipettor channel ({0}) on arm ({1}) (82)"; 
var channelId = 87; 
var armId = 42; 

message.Body = string.Format(
    "<html><body>Request is complete<br/>" + 
    "Service Request initiated by you is Complete<br/>" + 
    "Please use the following link to access " + 
    "<a href=\"{0}{1}\">{0}{1}</a><br/>" + 
    "Reason For Failure: {2}<br/></body></html>", 
    RunLogURL, runLogID, 
    String.Format(serviceEntry.ReasonForFailure, channelId, armId)); 

또는 당신은이 작업에 그것을 할 수 있습니다 :

serviceEntry.ReasonForFailure = "10003 Insufficient Liquid Level detected at " + 
    "pipettor channel ({0}) on arm ({1}) (82)"; 

var channelId = 87; 
var armId = 42; 

var reasonForFailure = String.Format(serviceEntry.ReasonForFailure, channelId, armId); 

message.Body = string.Format(
    "<html><body>Request is complete<br/>" + 
    "Service Request initiated by you is Complete<br/>" + 
    "Please use the following link to access " + 
    "<a href=\"{0}{1}\">{0}{1}</a><br/>" + 
    "Reason For Failure: {2}<br/></body></html>", 
    RunLogURL, runLogID, reasonForFailure); 
+0

이 문자열에서 문자가 대체되지 않습니다. 내 의도는이 변수의 값을 그대로두고 아무것도 대체하지 않는 것입니다. 예외가 발생했습니다. 입력 문자열이 올바른 형식이 아닙니다. –

+0

아, 알겠습니다. 위의 첫 번째 예제가 그 문제를 해결할 것이라고 생각합니다. 변수에는 두 개의 닫는 중괄호가 있는데'String.Format'은 오직 하나만 필요합니다. –

+0

주의 두 번째와 세 번째 예제에서 입력 문자열을 수정해야했습니다 (여기서 변수 값에 string.format을 사용했습니다). –