2011-08-12 4 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 

Si je saisis "TEST" dans la fonction ci-dessus. La sortie est "TEST". Idéalement, il serait sortie « Test ».ToTitleCase ne fonctionne pas sur toutes les chaînes majuscules

J'ai essayé aussi les extraits de code de ce poste en vain: Use of ToTitleCase

Répondre

22

Si ma mémoire est bonne, ToTitleCase() ne semblait pas fonctionner pour toutes les chaînes capitalisées. Il vous oblige fondamentalement à convertir la chaîne en minuscules avant le traitement.

De MSDN:

En général, boîtier titre convertit le premier caractère d'un mot à majuscule et le reste des caractères en minuscules. Cependant, cette méthode ne fournit pas actuellement de boîtier approprié pour convertir un mot qui est entièrement en majuscules, comme un acronyme.

Solution Utilisation (en C#):

string yourString = "TEST"; 

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

Pour ajouter à votre grande réponse, il est également intéressant de noter que vous pouvez simplement faire: 'System.Globalization.CultureInfo.InvariantCulture.TextInfo.ToTitleCase (myString.ToLower());' plutôt que de créer plusieurs objets. –

+0

Merci Jamie, qui a semblé aimé une longue chaîne à mettre, et je ne supporte pas les barres de défilement dans mes blocs de code :) –

2

également String.ToTitleCase() fonctionnera pour la plupart des chaînes, mais a un problème avec des noms comme McDonald et O'Brian, et j'utiliser CurrentCulture pour les variations de capitalisation. Ceci est une méthode simple d'extension qui va gérer ces:

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; 

} 

également le IndexOfAny (String []) extension:

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

En ce qui concerne la réponse 1, c'est une bonne idée, mais le code ne compile pas; et, corrigé pour la syntaxe, cela ne fonctionne pas. Je n'ai pas eu le temps de le déboguer mais vous en aurez besoin si vous voulez l'utiliser. Une partie du problème est que l'index suppose des index basés sur 1 mais ils sont basés sur 0 en C#. Il y a aussi d'autres problèmes.

Questions connexes