it-swarm-es.tech

¿Cómo puedo escribir en mayúscula la primera letra del nombre y el apellido en C #?

¿Hay una manera fácil de poner en mayúscula la primera letra de una cadena y bajar el resto? ¿Hay un método incorporado o necesito hacer el mío?

139
Mike Roosa

TextInfo.ToTitleCase() pone en mayúscula el primer carácter de cada token de una cadena.
Si no es necesario mantener el acrónimo en mayúsculas y minúsculas, debe incluir ToLower().

string s = "JOHN DOE";
s = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(s.ToLower());
// Produces "John Doe"

Si CurrentCulture no está disponible, use:

string s = "JOHN DOE";
s = new System.Globalization.CultureInfo("en-US", false).TextInfo.ToTitleCase(s.ToLower());

Consulte el MSDN Link para una descripción detallada.

256
ageektrapped
CultureInfo.CurrentCulture.TextInfo.ToTitleCase("hello world");
117
Nathan Baulch
String test = "HELLO HOW ARE YOU";
string s = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(test);

El código anterior no funcionará ...

a continuación, coloque el código de abajo para convertir a una baja y luego aplique la función

String test = "HELLO HOW ARE YOU";
string s = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(test.ToLower());
30

Hay algunos casos que CultureInfo.CurrentCulture.TextInfo.ToTitleCase no puede manejar, por ejemplo: el apóstrofe '.

string input = CultureInfo.CurrentCulture.TextInfo.ToTitleCase("o'reilly, m'grego, d'angelo");
// input = O'reilly, M'grego, D'angelo

A regex también se puede usar \b[a-zA-Z] para identificar el carácter inicial de una Palabra después de un límite de Palabra \b, entonces solo necesitamos reemplazar la coincidencia por su mayúscula en mayúsculas gracias al método Regex.Replace(string input,string pattern,MatchEvaluator evaluator) method:

string input = "o'reilly, m'grego, d'angelo";
input = Regex.Replace(input.ToLower(), @"\b[a-zA-Z]", m => m.Value.ToUpper());
// input = O'Reilly, M'Grego, D'Angelo

La regex se puede ajustar si es necesario, por ejemplo, si queremos manejar los casos MacDonald y McFry, la expresión regular se convierte en: (?<=\b(?:mc|mac)?)[a-zA-Z]

string input = "o'reilly, m'grego, d'angelo, macdonald's, mcfry";
input = Regex.Replace(input.ToLower(), @"(?<=\b(?:mc|mac)?)[a-zA-Z]", m => m.Value.ToUpper());
// input = O'Reilly, M'Grego, D'Angelo, MacDonald'S, McFry

Si necesitamos manejar más prefijos, solo necesitamos modificar el grupo (?:mc|mac), por ejemplo, para agregar prefijos en francés du, de: (?:mc|mac|du|de).

Finalmente, podemos darnos cuenta de que este regex también coincidirá con el caso MacDonald'S para el último 's, por lo que necesitamos manejarlo en el regex con un aspecto negativo detrás de (?<!'s\b). Al final tenemos:

string input = "o'reilly, m'grego, d'angelo, macdonald's, mcfry";
input = Regex.Replace(input.ToLower(), @"(?<=\b(?:mc|mac)?)[a-zA-Z](?<!'s\b)", m => m.Value.ToUpper());
// input = O'Reilly, M'Grego, D'Angelo, MacDonald's, McFry
12
polkduran

Mc y Mac son prefijos de apellidos comunes en todos los Estados Unidos, y hay otros. TextInfo.ToTitleCase no maneja esos casos y no debe usarse para este propósito. Así es como lo estoy haciendo:

    public static string ToTitleCase(string str)
    {
        string result = str;
        if (!string.IsNullOrEmpty(str))
        {
            var words = str.Split(' ');
            for (int index = 0; index < words.Length; index++)
            {
                var s = words[index];
                if (s.Length > 0)
                {
                    words[index] = s[0].ToString().ToUpper() + s.Substring(1);
                }
            }
            result = string.Join(" ", words);
        }
        return result;
    }
7
Jamie Ide

ToTitleCase () debería funcionar para usted.

http://support.Microsoft.com/kb/312890

5
ckal

La opción más directa será utilizar la función ToTitleCase que está disponible en .NET y que debería ocuparse del nombre la mayor parte del tiempo. Como edg señaló, hay algunos nombres para los que no funcionará, pero estos son bastante raros, así que, a menos que esté apuntando a una cultura en la que dichos nombres sean comunes, no es necesario algo de lo que deba preocuparse demasiado.

Sin embargo, si no está trabajando con un lenguaje .NET, entonces dependerá de cómo se vea la entrada: si tiene dos campos separados para el nombre y el apellido, simplemente puede poner en mayúscula la primera letra y el resto del texto. subcadenas.

firstName = firstName.Substring(0, 1).ToUpper() + firstName.Substring(1).ToLower();
lastName = lastName.Substring(0, 1).ToUpper() + lastName.Substring(1).ToLower();

Sin embargo, si se le proporcionan varios nombres como parte de la misma cadena, entonces necesita saber cómo está obteniendo la información y dividirla en consecuencia. Entonces, si obtienes un nombre como "John Doe", divides la cadena según el carácter de espacio. Si está en un formato como "Doe, John", tendrá que dividirlo según la coma. Sin embargo, una vez que lo haya separado, simplemente aplique el código que se muestra anteriormente.

4
rjzii

Utilizo mi propio método para arreglar esto:

Por ejemplo, la frase: "hola mundo. Hola, este es el mundo de stackoverflow". será "Hello World. Hello This is The Stackoverflow World". Regex\b (inicio de una palabra)\w (primer carácter de la palabra) hará el truco.

/// <summary>
/// Makes each first letter of a Word uppercase. The rest will be lowercase
/// </summary>
/// <param name="Phrase"></param>
/// <returns></returns>
public static string FormatWordsWithFirstCapital(string Phrase)
{
     MatchCollection Matches = Regex.Matches(Phrase, "\\b\\w");
     Phrase = Phrase.ToLower();
     foreach (Match Match in Matches)
         Phrase = Phrase.Remove(Match.Index, 1).Insert(Match.Index, Match.Value.ToUpper());

     return Phrase;
}
3
Ton Snoei

CultureInfo.CurrentCulture.TextInfo.ToTitleCase ("mi nombre");

devuelve ~ mi nombre

Pero el problema todavía existe con nombres como McFly como se dijo anteriormente.

3
David C

Esta clase hace el truco. Puede agregar nuevos prefijos a la matriz de cadenas _prefixes static.

public static class StringExtensions
{
        public static string ToProperCase( this string original )
        {
            if( String.IsNullOrEmpty( original ) )
                return original;

            string result = _properNameRx.Replace( original.ToLower( CultureInfo.CurrentCulture ), HandleWord );
            return result;
        }

        public static string WordToProperCase( this string Word )
        {
            if( String.IsNullOrEmpty( Word ) )
                return Word;

            if( Word.Length > 1 )
                return Char.ToUpper( Word[0], CultureInfo.CurrentCulture ) + Word.Substring( 1 );

            return Word.ToUpper( CultureInfo.CurrentCulture );
        }

        private static readonly Regex _properNameRx = new Regex( @"\b(\w+)\b" );
        private static readonly string[] _prefixes = {
                                                         "mc"
                                                     };

        private static string HandleWord( Match m )
        {
            string Word = m.Groups[1].Value;

            foreach( string prefix in _prefixes )
            {
                if( Word.StartsWith( prefix, StringComparison.CurrentCultureIgnoreCase ) )
                    return prefix.WordToProperCase() + Word.Substring( prefix.Length ).WordToProperCase();
            }

            return Word.WordToProperCase();
        }
}
2
Eddie Velasquez

Las sugerencias para usar ToTitleCase no funcionarán para cadenas que estén en mayúsculas. Así que tendrás que llamar a ToUpper en la primera char y ToLower en los caracteres restantes.

2
Tundey

Si usa vS2k8, puede usar un método de extensión para agregarlo a la clase String:

public static string FirstLetterToUpper(this String input)
{
    return input = input.Substring(0, 1).ToUpper() + 
       input.Substring(1, input.Length - 1);
}
1
FlySwat

Para resolver algunos de los problemas/problemas que se han resaltado, sugeriría convertir primero la cadena a minúsculas y luego llamar al método ToTitleCase. Luego puede usar IndexOf ("Mc") o IndexOf ("O '') para determinar casos especiales que requieren atención más específica.

inputString = inputString.ToLower();
inputString = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(inputString);
int indexOfMc = inputString.IndexOf(" Mc");
if(indexOfMc  > 0)
{
   inputString.Substring(0, indexOfMc + 3) + inputString[indexOfMc + 3].ToString().ToUpper() + inputString.Substring(indexOfMc + 4);
}
0
Andy Rose
 public static string ConvertToCaptilize(string input)
        {
            if (!string.IsNullOrEmpty(input))
            {
                string[] arrUserInput = input.Split(' ');


                // Initialize a string builder object for the output
                StringBuilder sbOutPut = new StringBuilder();


                // Loop thru each character in the string array
                foreach (string str in arrUserInput)
                {
                    if (!string.IsNullOrEmpty(str))
                    {
                        var charArray = str.ToCharArray();
                        int k = 0;
                        foreach (var cr in charArray)
                        {
                            char c;
                            c = k == 0 ? char.ToUpper(cr) : char.ToLower(cr);
                            sbOutPut.Append(c);
                            k++;
                        }


                    }
                    sbOutPut.Append(" ");
                }
                return sbOutPut.ToString();
            }
            return string.Empty;

        }
0
Govind Singh Rawat

Me gusta de esta manera

using System.Globalization;
...
TextInfo myTi = new CultureInfo("en-Us",false).TextInfo;
string raw = "THIS IS ALL CAPS";
string firstCapOnly = myTi.ToTitleCase(raw.ToLower());

Levantado de este artículo de MSDN .

0
TrentVB

Espero que esto te ayude.

String fName = "firstname";
String lName = "lastname";
String capitalizedFName = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(fName);
String capitalizedLName = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(lName);
0
Arun