2011-08-12 14 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 ingreso "TEST" en la función anterior. La salida es "TEST". Lo ideal sería que la producción de "Prueba".ToTitleCase no funciona en todas las mayúsculas

también probé los fragmentos de código de este post fue en vano: Use of ToTitleCase

Respuesta

22

Si falla la memoria, ToTitleCase() nunca parecía funcionar para todas las cadenas en mayúsculas. Básicamente, requiere que convierta la cadena a minúsculas antes del procesamiento.

Desde el MSDN:

En general, la carcasa del título convierte el primer carácter de una palabra a mayúscula y el resto de los caracteres en minúsculas. Sin embargo, , este método actualmente no proporciona la cubierta adecuada para convertir una palabra que es enteramente mayúscula, como un acrónimo.

Uso Solución (en C#):

string yourString = "TEST"; 

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

Para agregar a su gran respuesta, también vale la pena señalar que simplemente puede hacer: 'System.Globalization.CultureInfo.InvariantCulture.TextInfo.ToTitleCase (myString.ToLower());' en lugar de crear múltiples objetos. –

+0

Gracias Jamie, que me pareció una cadena larga para poner, y no soporto barras de desplazamiento en mis bloques de código :) –

2

también String.ToTitleCase() funciona para la mayoría de las cadenas, pero tiene un problema con nombres como McDonald y O'Brian, y utilizo CurrentCulture para variaciones en capitalización. Este es un método simple extensión que se encargará de las siguientes:

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; 

} 

También el IndexOfAny (String []) extensión:

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 cuanto a la respuesta 1, es una buena idea, pero el código no compila; y, cuando se corrige la sintaxis, no funciona. No tuve tiempo para depurarlo, pero lo necesitarás si quieres usarlo. Parte del problema es que el índice supone índices basados ​​en 1, pero están basados ​​en 0 en C#. Hay otros problemas también.

Cuestiones relacionadas