2010-02-07 3 views
13

ToString 형식의 형식을 지정하고 싶지만이를 처리하는 가장 좋은 방법은 확실하지 않습니다.내 자신의 사용자 지정 ToString() 형식을 어떻게 만듭니 까?

예 I는 다음의 지시자가 있다면

  • EE = 장비
  • ED = 장비 설명
  • EI = 장비 ID 그래서

I는 등의 ToString를 사용한 경우 그 :

eqp.ToString("EE-EI (ED)") 

출력 할 수 있습니다

"CAT994-61 (Front end loader)" 

가장 좋은 방법은 문자열을 검색하고 토큰 교환을 할 수 있을까요? 누구든지이 작업을 수행하는 예가 있습니까?

현재 순응도가 string.Replace이고 현재 잘 작동합니다.

public class Equipment 
{ 
    // (other class code) 

    public string ToString(string format) 
    { 
     string output = format; 
     output = output.Replace("EE", _EquipID); 
     output = output.Replace("ED", _EquipDescription); 
     output = output.Replace("DI", _DepartID); 
     return output; 
    } 

    public override string ToString() 
    { 
     return _EquipID; 
    } 
} 

답변

13

문자열 형식을 결합하고, 오버로드 ToString이 작업을 수행 할 수 있습니다 Replace 함수를 더 멋지게 만들 수 있습니다.

oProd.ToString("EE,ED,EI"); 
oProd.ToString("EE-ED (EI)"); // change order 
oProd.ToString("ED-EE,EE,EE (EI)"); // multiple times 
oProd.ToString("ED:EI"); // have some missing 
etc 

및 String.format가 원하는 방식을 형식 변수의 위치를 ​​그들에게 여러 번, 또는 일부를 드롭 할 수있는 유연성을 제공 : 다음과 같이


사용할 수 있습니다. 당신이 동적하려면

+0

string.format() 메서드는 유연성을 떨어 뜨리지 않습니다. 위의 편집을 참조하십시오. 나는 당신의 대답을 사용했지만, 나는 string.format() – fishhead

0

String.Format을 사용하십시오.

String.Format("{0}-{1} ({2})", "CAT994", 61, "Front end loader"); 

예상 출력을 생성합니다.

+0

ToString ("EI - EE")처럼 토큰을 혼합해도 여전히 작동할까요? – fishhead

+0

'String.Format ("{1} - {0} ({2})", "Foo", "Bar", "Baz");'결과는 "Bar-Foo (Baz)"입니다. –

0

당신은

public override string ToString() 
{ 
    /* some code handling here */ 
    return ""; //your own formated string 
} 
0

형식은 좋은 해결책 같은 소리처럼 객체의를 toString 함수를 오버로드해야합니다.
아마도 입력 변수를 그룹으로 잘라내는 훌륭한 정규 표현식 (들) 일 것입니다.

난 당신이 할 수있는 경우에 많은 기존의 형식을 사용하려고합니다 :

public override string ToString(string myFormat) 
{ 
    myFormat = myFormat.Replace("EE", "{0}"); 
    myFormat = myFormat.Replace("EI", "{1}"); 
    myFormat = myFormat.Replace("ED", "{2}"); 
    return String.Format(myFormat, this.equipment, this.description, this.id); 
} 

또한 정규 표현식을 사용할 수 있습니다
http://blog.stevex.net/string-formatting-in-csharp/

6

먼저 toString를 오버라이드 (override)는()

을 다음 당신은 한 번에 형식 문자열을 토큰을 구문 분석하고 출력 문자열에 적절한 문자열을 추가해야합니다. 단일 문자 형식 지정자를 사용하면 한 번에 한 문자 씩 구문 분석 할 수 있기 때문에 조금 더 간단 해집니다. 특수 문자 인 경우 해당 데이터를 출력하고 그렇지 않으면 문자를 출력합니다.

그래서이

public override string ToString(string format) 
{ 
    StringBuilder s = new StringBuilder(); 

    foreach (char c in format) 
    { 
    switch (c) 
    { 
     case 'E': 
     s.Append(EquipID); 
     break; 
     case 'D': 
     s.Append(EquipDesc); 
     break; 
     case 'I': 
     s.Append(DepartID); 
     break; 
     default: 
     s.Append(c); 
     break; 
    } 
    } 

    return s.ToString(); 
} 

같은이 호출을 대체 할 여러 문자열보다 더 효율적으로 한 번에 그 일의 비교적 작은 장점이있다.

+0

+1에 대한 요점을 잘 모르겠다. +1, 나는 그것을 좋아한다. – Amirshk

2
String.Format("{0:foo}", object); 

은 그래서 당신의 ToString(string format) 방법을 염두에두고 걸리는 인수를 설계하는 의미가 "foo"object.ToString(string format);에 전달 끝날 것입니다. 개체의 ToString 메서드에 전달되는 - "EE EI", 그래서 당신이 설명하는대로이 작동 할 수 있지만,이에 하나 개의 표현 형식을 제한하는 것이 더 적합 할 수 있습니다 귀하의 예제에서

String.Format("{0:EI - EE}", object); 

이 초래 시간이

String.Format("{0:EI} - {0:EE}", object); 

가 출력으로 "CAT994-61"을 얻을 수있는 방법, 그리고 것처럼 toString() 메서드는 다음과 같습니다 될 수 간단

public override string ToString(string myFormat) 
{ 
    string str = null; 
    switch (myformat.ToLower()) 
    { 
     case "ee": str = this.equipment; break; 
     case "ei": str = this.description; break; 
     case "ed": str = this.id; break; 
     default: str = this.ToString(); break; 
    } 
    return str; 
} 

당신은 하나의하자로 형식 지정을 줄일 경우 다른 개체가 ToString 형식을 처리하는 방식과 일관성이 있습니다.

관련 문제