2009-12-03 7 views
36

Czy można określić flagę lub modyfikator w parametrze formatu ciągowego, aby był pisany małymi literami lub dużymi literami?Flaga formatu ciągów C# lub modyfikator na małe litery

Przykład czego chcę:

String.Format("Hi {0:touppercase}, you have {1} {2:tolowercase}.", "John", 6, "Apples"); 

wyjście Poszukiwany

JOHN Cześć, masz 6 jabłek.

PS: Tak, wiem, że mogę zmienić przypadek parametru przed użyciem go w formacie ciągu znaków, ale nie chcę tego.

+4

wiem, że nie chcę, ale nie mogę zrozumieć, dlaczego po prostu wywołanie .tolower() lub .toupper() na ciąg params jest problemem. – tjmoore

+5

"Nie widzę powodu, dla którego zwykłe wywoływanie funkcji .tower() lub .toupper() w łańcuchach znaków jest problemem" - na przykład powiązanie danych. – Joe

+0

Mam tę samą sytuację. Powód .ToLower() nie będzie dla mnie działał, ponieważ łańcuch formatowania pochodzi z bazy danych (tzn. Jest konfigurowalny przez użytkownika końcowego). – Ryan

Odpowiedz

55

Istnieje tylko dopełnienie i dopasowanie kształtu ... Tak więc prosty sposób jest taki, jak mówiłeś, użyj "John".ToUpper() lub "John".ToLower().

Innym rozwiązaniem może być utworzenie niestandardowego IFormatProvider, aby zapewnić żądany format ciągu.

Oto jak będzie wyglądać IFormatProvider i string.Format call.

public class CustomStringFormat : IFormatProvider, ICustomFormatter 
{ 
    public object GetFormat(Type formatType) 
    { 
     if (formatType == typeof(ICustomFormatter)) 
      return this; 
     else 
      return null; 

    } 

    public string Format(string format, object arg, IFormatProvider formatProvider) 
    { 
     string result = arg.ToString(); 

     switch (format.ToUpper()) 
     { 
      case "U": return result.ToUpper(); 
      case "L": return result.ToLower(); 
      //more custom formats 
      default: return result; 
     } 
    } 
} 

a rozmowa będzie wyglądać następująco:

String.Format(new CustomStringFormat(), "Hi {0:U}", "John"); 
+1

Czy jest jakiś sposób robienia tego w ramach DisplayFormatAttribute? – howcheng

+0

Jeśli format nie zostanie określony, pojawi się 'NullReferenceException', więc należy dodać warunek zerowy w metodzie' Format() '. – gabr

6

Krótko mówiąc, nie; AFAIK, musisz naprawić wartości źródłowe lub użyć własnego zamiennika do string.Format. Zwróć uwagę, że jeśli przekazujesz niestandardową kulturę (do string.Format), możesz użyć culture.TextInfo.ToLower(s), a nie tylko s.ToLower().

+0

Chciałem tylko zaproponować napisanie własnego formatyzatora napisów. – ChrisF

+0

Rzeczywiście - możesz prawdopodobnie * zacząć * tutaj: http://stackoverflow.com/questions/1322037#1322103, ale wiele więcej do zrobienia ... –

Powiązane problemy