2011-08-12 13 views
14
Public Function TitleCase(ByVal strIn As String) 
     Dim result As String = "" 
     Dim culture As New CultureInfo("en", False) 
     Dim tInfo As TextInfo = culture.TextInfo() 
     result = tInfo.ToTitleCase(strIn) 
     Return result 
End Function 

Jeśli wprowadzę "TEST" do powyższej funkcji. Wyjście to "TEST". Idealnie byłoby to wyjście „Test”.ToTitleCase nie działa na wszystkie wielkie litery

Próbowałem też fragmenty kodu z tego postu bezskutecznie: Use of ToTitleCase

Odpowiedz

22

Jeśli mnie pamięć nie myli, ToTitleCase() nigdy nie wydawało się do pracy dla wszystkich aktywowanych strun. Zasadniczo wymaga to konwersji ciągu na małe litery przed przetworzeniem.

Od MSDN:

Generalnie tytuł obudowa zamienia pierwszą literę wyrazu do wielką i reszta znaków na małe litery. Jednak w tym przypadku metoda nie zapewnia obecnie odpowiedniej obudowy do przekonwertowania słowa o numerze z całkowitą liczbą liter, na przykład akronimu.

Obejście Usage (w języku C#):

string yourString = "TEST"; 

TextInfo formatter = new CultureInfo("en-US", false).TextInfo;  
formatter.ToTitleCase(yourString.ToLower()); 
+8

Aby dodać do swojej wspaniałej odpowiedzi, warto również zauważyć, że można po prostu zrobić: 'System.Globalization.CultureInfo.InvariantCulture.TextInfo.ToTitleCase (myString.ToLower());' zamiast tworzyć wiele obiektów. –

+0

Dzięki Jamie, wydawało się, że lubisz długi sznurek do wstawienia, i nie mogę znieść sztabek w blokach kodu :) –

2

także String.ToTitleCase() będzie pracować dla większości strun, ale ma problem z nazwami takimi jak McDonald i O'Brian i używam CurrentCulture dla zmian w kapitalizacji. Jest to prosta metoda rozszerzenie, które będą obsługiwać te:

public string ToProperCase(this string value) 
{ 

    if (string.IsNullOrEmpty(value)) { 
     return ""; 
    } 

    string proper = System.Threading.Thread.CurrentThread.CurrentCulture. 
        TextInfo.ToTitleCase(value.ToLower()); 

    int oddCapIndex = proper.IndexOfAny({ 
     "D'", 
     "O'", 
     "Mc" 
    }); 


    if (oddCapIndex > 0) { 
     // recurse 
     proper = proper.Substring(0, oddCapIndex + 2) + 
       proper.Substring(oddCapIndex + 2).ToProperCase(); 

    } 

    return proper; 

} 

Również IndexOfAny (String []) rozszerzenie:

public int IndexOfAny(this string test, string[] values) 
{ 
    int first = -1; 
    foreach (string item in values) { 
     int i = test.IndexOf(item); 
     if (i > 0) { 
      if (first > 0) { 
       if (i < first) { 
        first = i; 
       } 
      } else { 
       first = i; 
      } 
     } 
    } 
    return first; 
} 
0

chodzi o odpowiedź 1, jest to niezły pomysł, ale kod nie kompiluje; a po poprawieniu składni nie działa. Nie miałem czasu na debugowanie, ale będziesz musiał, jeśli chcesz go użyć. Część problemu polega na tym, że indeks zakłada indeksy oparte na 1, ale są one oparte na 0 w C#. Są też inne problemy.

Powiązane problemy