Como capitalizar o primeiro caractere de cada palavra, ou o primeiro caractere de uma string inteira, com C #?

Eu poderia escrever meu próprio algoritmo para fazê-lo, mas acho que deveria haver o equivalente a ser humanizado em C #.

Eu pesquisei, mas só encontrei maneiras de humanizar datas.

Exemplos:

  • Uma maneira de transformar “Lorem Lipsum Et” em “Lorem lipsum et”
  • Uma maneira de transformar “Lorem lipsum et” em “Lorem Lipsum Et”

Como discutido nos comentários da resposta de @ miguel , você pode usar o TextInfo.ToTitleCase que está disponível desde o .NET 1.1. Aqui está algum código correspondente ao seu exemplo:

 string lipsum1 = "Lorem lipsum et"; // Creates a TextInfo based on the "en-US" culture. TextInfo textInfo = new CultureInfo("en-US",false).TextInfo; // Changes a string to titlecase. Console.WriteLine("\"{0}\" to titlecase: {1}", lipsum1, textInfo.ToTitleCase( lipsum1 )); // Will output: "Lorem lipsum et" to titlecase: Lorem Lipsum Et 

Ele irá ignorar maiúsculas e minúsculas que são todas em maiúsculas, como “LOREM LIPSUM ET”, porque está cuidando de casos se acrônimos estiverem em texto (para que ” NAMBLA ” não se torne “nambla” ou “Nambla”).

No entanto, se você quiser apenas capitalizar o primeiro caractere, pode fazer a solução que está por aqui … ou pode simplesmente dividir a sequência e capitalizar a primeira na lista:

 string lipsum2 = "Lorem Lipsum Et"; string lipsum2lower = textInfo.ToLower(lipsum2); string[] lipsum2split = lipsum2lower.Split(' '); bool first = true; foreach (string s in lipsum2split) { if (first) { Console.Write("{0} ", textInfo.ToTitleCase(s)); first = false; } else { Console.Write("{0} ", s); } } // Will output: Lorem lipsum et 

Use expressões regulares para isso parece muito mais limpo:

 string s = "the quick brown fox jumps over the lazy dog"; s = Regex.Replace(s, @"(^\w)|(\s\w)", m => m.Value.ToUpper()); 

Existe outra solução elegante:

Defina a function ToTitleCase em uma class estática do seu projet

 using System.Globalization; public static string ToTitleCase(this string title) { return CultureInfo.CurrentCulture.TextInfo.ToTitleCase(title); } 

E, em seguida, use-o como uma extensão de string em qualquer lugar do seu projeto:

 "have a good day !".ToTitleCase() // "Have A Good Day !" 

Se você quer apenas capitalizar o primeiro caractere, apenas coloque-o em um método de utilitário próprio:

 return string.IsNullOrEmpty(str) ? str : str[0].ToUpperInvariant() + str.Substring(1).ToLowerInvariant(); 

Há também um método de biblioteca para capitalizar o primeiro caractere de cada palavra:

http://msdn.microsoft.com/pt-br/library/system.globalization.textinfo.totitlecase.aspx

A técnica CSS está ok, mas apenas altera a apresentação da string no navegador. Um método melhor é tornar o texto em maiúsculas antes de enviar para o navegador.

A maioria das implementações acima são aceitáveis, mas nenhuma delas aborda a questão do que acontece se você tiver palavras de maiúsculas e minúsculas que precisam ser preservadas, ou se você quiser usar o caso verdadeiro, por exemplo:

“Onde estudar os cursos de doutorado nos EUA”

ou

“Formulário IRS UB40a”

Também usando CultureInfo.CurrentCulture.TextInfo.ToTitleCase (string) preserva palavras maiúsculas como em “esportes e baseball MLB”, que se torna “Sports And MLB Baseball”, mas se toda a cadeia é colocada em maiúsculas, então isso causa um problema.

Então, eu coloquei uma function simples que permite que você mantenha as maiúsculas e minúsculas e as letras minúsculas (se não estiverem no início e no final da frase), incluindo-as em uma matriz de cadeias specialCases e lowerCases:

 public static string TitleCase(string value) { string titleString = ""; // destination string, this will be returned by function if (!String.IsNullOrEmpty(value)) { string[] lowerCases = new string[12] { "of", "the", "in", "a", "an", "to", "and", "at", "from", "by", "on", "or"}; // list of lower case words that should only be capitalised at start and end of title string[] specialCases = new string[7] { "UK", "USA", "IRS", "UCLA", "PHd", "UB40a", "MSc" }; // list of words that need capitalisation preserved at any point in title string[] words = value.ToLower().Split(' '); bool wordAdded = false; // flag to confirm whether this word appears in special case list int counter = 1; foreach (string s in words) { // check if word appears in lower case list foreach (string lcWord in lowerCases) { if (s.ToLower() == lcWord) { // if lower case word is the first or last word of the title then it still needs capital so skip this bit. if (counter == 0 || counter == words.Length) { break; }; titleString += lcWord; wordAdded = true; break; } } // check if word appears in special case list foreach (string scWord in specialCases) { if (s.ToUpper() == scWord.ToUpper()) { titleString += scWord; wordAdded = true; break; } } if (!wordAdded) { // word does not appear in special cases or lower cases, so capitalise first letter and add to destination string titleString += char.ToUpper(s[0]) + s.Substring(1).ToLower(); } wordAdded = false; if (counter < words.Length) { titleString += " "; //dont forget to add spaces back in again! } counter++; } } return titleString; } 

Este é apenas um método rápido e simples - e provavelmente pode ser melhorado um pouco se você quiser gastar mais tempo com isso.

Se você quiser manter a capitalização de palavras menores como "a" e "de", basta removê-las da matriz de strings de casos especiais. Organizações diferentes têm regras diferentes sobre capitalização.

Você pode ver um exemplo deste código em ação neste site: Egg Donation London - este site cria automaticamente trilhas de breadcrumb no topo das páginas analisando o url, por exemplo, "/ services / uk-egg-bank / introduction" - então cada o nome da pasta na trilha tem hifens substituídos por espaços e coloca em maiúscula o nome da pasta, de modo que o uk-egg-bank se torna o UK Egg Bank. (preservando a maiúscula 'UK')

Uma extensão deste código poderia ser ter uma tabela de consulta de siglas e palavras maiúsculas / minúsculas em um arquivo de texto compartilhado, tabela de database ou serviço da Web para que a lista de palavras de maiúsculas e minúsculas possa ser mantida em um único local e se aplique a muitos diferentes aplicativos que dependem da function.

Até onde eu sei, não há uma maneira de fazer isso sem escrever (ou cribbing) código. C # nets (ha!) Você superior, inferior e título (o que você tem) casos:

http://support.microsoft.com/kb/312890/EN-US/

Não há solução pré-configurada para captialização lingüística adequada no .NET. Para que tipo de capitialização você está indo? Você está seguindo as convenções do Manual de Estilo de Chicago? AMA ou MLA? Mesmo a capitalização de sentenças em inglês simples tem 1000 exceções especiais para palavras. Eu não posso falar com o que o humanizado de Ruby faz, mas imagino que provavelmente não siga as regras lingüísticas de capitalização e, em vez disso, faça algo muito mais simples.

Internamente, encontramos esse mesmo problema e tivemos que escrever um código de quantidade razoavelmente grande apenas para lidar com o case apropriado (em nosso pequeno mundo) de títulos de artigos, nem mesmo considerando a capitalização de sentenças. E de fato fica “fuzzy” 🙂

Isso realmente depende do que você precisa – por que você está tentando converter as sentenças para a capitalização apropriada (e em que contexto)?