2017-11-15 4 views
0

내 응용 프로그램의 최종 사용자가 string.Format에 사용 된 형식 문자열을 편집하길 원합니다. 나는 사용자가 템플릿을 편집 할 수 있도록하기 위해 그렇게하고 싶습니다. 사용자가 너무 많은 마커를 입력하면 문제가 발생합니다.string. 여분의 마커를 사용하여 예외를 throw하지 않는 형식의 문자열

이 잘 작동 :

var result = string.Format("test {0}, {1}, {2}", 1, 2, 3); 

이 너무 작동합니다

var result = string.Format("test {0}, {1}", 1, 2, 3); 

그러나 이것은 예외가 발생합니다 :

var result = string.Format("test {0}, {1}, {2}", 1, 2); 

System.FormatException '색인 (영 기준) 0보다 크거나 이어야합니다. 인수 목록의 크기보다 작습니다. '

마커가있는만큼 매개 변수를 추가해야하지만 최종 사용자는이를 알지 못하거나 실수를 할 수 있음을 알고 있습니다. 추가 마커를 추가하십시오.

내 질문은 :
내가 string.Format 작동하지만 예외없이 방식으로 형식 문자열과 유사한 접근 방법을 사용할 수 있습니다.

나는 try\catch 블록을 사용하고 형식 문자열을 반환 할 수 있다는 것을 알고 있지만 그렇게하고 싶지는 않습니다.

나는 문자열에 마커를 대체 할 매우 간단한 방법 구축했습니다 :

public static string SafeFormat(string format, params object[] args) 
{ 
    var result = format; 
    for (int i = 0; i < args.Length; i++) 
    { 
     result = result.Replace($"{{{i}}}", args[i].ToString()); 
    } 
    return result; 
} 

을하지만,이 마커 대신에 사용되는 데이터의 포맷을 지원하지 않습니다.

내부적으로 string.Format은 (는) AppendFormatHelper (http://referencesource.microsoft.com/#mscorlib/system/text/stringbuilder.cs,2c3b4c2e7c43f5a4)을 사용하고 있습니다.

이상적으로 string.Format("test {0}, {1}, {2}", 1, 2)test 1, 2, {2}

+5

을 원하는 경우 사용자가 제공하는 겁니다 항목의 수에 대한 부적절한 형식 문자열을 제공 한 경우

public static class StringExtensions { public static string SafeFormat(this string value, params object[] args) { var pattern = @"{(.*?)}"; var matches = Regex.Matches(value, pattern); var matchCount = matches.Count; if (matchCount > args.Length) { var argsExtended = args.ToList(); for (int i = args.Length; i < matchCount; i++) { argsExtended.Add($"{{{i}}}"); //Can add null value to erase them } return string.Format(value, argsExtended.ToArray()); } return string.Format(value, args); } } 

쉽게 방법으로 변경할 수 있습니다, 당신이 *해야한다고 생각 * 플래그는 오류로 표시됩니다. 기본적으로 쓸데없는 데이터를 만드는 것보다 일찍 오류를보고하는 것이 좋습니다. 아마도 사용자는 특정 값이 출력에 포함될 것으로 기대합니다. 단지'{2} '를 포함하면 그것들을 돕지 않을 것입니다. –

+0

@JonSkeet 더 이상 동의하지 않습니다. 불행히도 처음부터 응용 프로그램을 만들지 않고 시스템이 더 복잡하고 기존 모듈에 오류가 있는지 템플릿을 검사하는 기능을 추가하는 작업이 많이 필요할 것입니다. 특히 매우 오래된 시스템입니다. 나는 최근에 다른 접근법을 사용하는 템플릿 관리 모듈의 새 버전을 만들기 시작했으나 곧 준비가되지 않을 것입니다. 따라서 임시 해결책이 필요합니다. 이러한 템플릿은 전자 메일 알림에만 사용되므로 여분의 마커가있는 경우 전자 메일에서이를 알 수 있습니다. – Misiu

+2

그런 경우에는 왜 여분의 값을 전달하지 않으시겠습니까? 'string.Format (formatString, realValue0, realValue1, "undefined", "undefined", "undefined")'? –

답변

1

하나의 솔루션은 값이 예상되는 얼마나 많은 확인하는 것입니다 반환해야합니다, 그냥 인수 목록 (null 또는 자리)에 다른 사람을 추가합니다. 예 문자열 확장 : 당신이

관련 문제