C #에서 위치가 아닌 이름으로 문자열을 형식화하는 방법이 있습니까?
파이썬에서는이 예제와 같은 것을 할 수 있습니다. 여기 ).
>>> print '%(language)s has %(#)03d quote types.' % \
{'language': "Python", "#": 2}
Python has 002 quote types.
C #에서 이것을 수행하는 방법이 있습니까? 예를 들어 :
String.Format("{some_variable}: {some_other_variable}", ...);
변수 이름을 사용 하여이 작업을 수행 할 수 있으면 좋지만 사전도 허용됩니다.
답변
이를 처리하기위한 기본 제공 방법이 없습니다.
string myString = "{foo} is {bar} and {yadi} is {yada}".Inject(o);
Status.Text = "{UserName} last logged in at {LastLoginDate}".FormatWith(user);
Phil Haack에서 위의 두 가지를 부분적으로 기반으로하는 세 번째 개선 된 방법
답변
방금 블로그에 게시 한 구현이 있습니다. http://haacked.com/archive/2009/01/04/fun-with-named-formats-string-parsing-and-edge-cases.aspx
중괄호 이스케이프와 관련된 다른 구현에서 발생하는 몇 가지 문제를 해결합니다. 게시물에 세부 정보가 있습니다. DataBinder.Eval도 수행하지만 여전히 매우 빠릅니다.
답변
보간 된 문자열 이 C # 6.0 및 Visual Basic 14에 추가되었습니다.
둘 다 Visual Studio 2015 에서 새로운 Roslyn 컴파일러를 통해 소개되었습니다 .
-
C # 6.0 :
return "\{someVariable} and also \{someOtherVariable}"
또는
return $"{someVariable} and also {someOtherVariable}"
-
출처 : C # 6.0의 새로운 기능
-
-
VB 14 :
return $"{someVariable} and also {someOtherVariable}"
- 출처 : VB 14의 새로운 기능
주목할만한 기능 (Visual Studio 2015 IDE) :
- 구문 색상 이 지원됩니다-문자열에 포함 된 변수가 강조 표시됩니다
- 리팩토링 지원-이름을 바꾸면 문자열에 포함 된 변수의 이름도 바뀝니다.
- 실제로 변수 이름뿐만 아니라 표현식 도 지원됩니다. 예 :
{index}
작동 할뿐만 아니라{(index + 1).ToString().Trim()}
즐겨! (VS에서 “웃음 보내기”를 클릭하십시오)
답변
다음과 같이 익명 유형을 사용할 수도 있습니다.
public string Format(string input, object p)
{
foreach (PropertyDescriptor prop in TypeDescriptor.GetProperties(p))
input = input.Replace("{" + prop.Name + "}", (prop.GetValue(p) ?? "(null)").ToString());
return input;
}
물론 형식화를 구문 분석하려면 더 많은 코드가 필요하지만 다음과 같이이 함수를 사용하여 문자열의 형식을 지정할 수 있습니다.
Format("test {first} and {another}", new { first = "something", another = "something else" })
답변
이 작업을 즉시 수행 할 수있는 방법이없는 것 같습니다. 그러나 for 값에 IFormatProvider
연결되는 자체 구현을 구현하는 것이 가능해 보입니다 IDictionary
.
var Stuff = new Dictionary<string, object> {
{ "language", "Python" },
{ "#", 2 }
};
var Formatter = new DictionaryFormatProvider();
// Interpret {0:x} where {0}=IDictionary and "x" is hash key
Console.WriteLine string.Format(Formatter, "{0:language} has {0:#} quote types", Stuff);
출력 :
파이썬에는 2 개의 따옴표 유형이 있습니다
주의 할 점은 혼합 할 수 없으므로 FormatProviders
멋진 텍스트 형식을 동시에 사용할 수 없다는 것입니다.
답변
프레임 워크 자체는이를 수행하는 방법을 제공하지 않지만 Scott Hanselman 의이 게시물 을 살펴볼 수 있습니다 . 사용법 예 :
Person p = new Person();
string foo = p.ToString("{Money:C} {LastName}, {ScottName} {BirthDate}");
Assert.AreEqual("$3.43 Hanselman, {ScottName} 1/22/1974 12:00:00 AM", foo);
James Newton-King 의이 코드 는 유사하며 하위 속성 및 색인과 작동합니다.
string foo = "Top result for {Name} was {Results[0].Name}".FormatWith(student));
James의 코드는 System.Web.UI.DataBinder에 의존합니다. 문자열을 구문 분석하고 어떤 사람들은 비 – 웹 애플리케이션에서 수행하는 좋아하지 않아 System.Web을 참조 할 필요합니다.
편집 : 아, 속성이 준비된 객체가 없다면 익명 유형과 잘 작동합니다.
string name = ...;
DateTime date = ...;
string foo = "{Name} - {Birthday}".FormatWith(new { Name = name, Birthday = date });
답변
보다 /programming/271398?page=2#358259를 하십시오.
링크 된 확장을 사용하면 다음과 같이 작성할 수 있습니다.
var str = "{foo} {bar} {baz}".Format(foo=>"foo", bar=>2, baz=>new object());
그리고 당신은 "foo 2 System.Object
“를 얻을 것이다 .
