Existe uma maneira fácil de colocar em maiúscula a primeira letra de uma string e diminuir o restante? Existe um método embutido ou preciso criar o meu?
c#
string
capitalize
Mike Roosa
fonte
fonte
Respostas:
TextInfo.ToTitleCase()
coloca em maiúscula o primeiro caractere em cada token de uma string.Se não houver necessidade de manter a sigla Maiúsculas, inclua
ToLower()
.Se CurrentCulture estiver indisponível, use:
Consulte o link do MSDN para obter uma descrição detalhada.
fonte
fonte
sItem = Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(sItem.ToLower) 'first char upper case
CurrentCulture
, como podemos ter certeza de que não há cultura que lide com isso de maneira diferente?O código acima não funcionará .....
então coloque o código abaixo convertendo para lower e aplique a função
fonte
Existem alguns casos que
CultureInfo.CurrentCulture.TextInfo.ToTitleCase
não conseguem lidar, por exemplo: o apóstrofo'
.Um regex também pode ser usado
\b[a-zA-Z]
para identificar o caractere inicial de uma palavra após o limite de uma palavra\b
; então, basta substituir a correspondência por sua equivalência em maiúsculas, graças aoRegex.Replace(string input,string pattern,MatchEvaluator evaluator)
método:A regex pode ser ajustado, se necessário, por exemplo, se quisermos lidar com os
MacDonald
eMcFry
casos, o regex se torna:(?<=\b(?:mc|mac)?)[a-zA-Z]
Se precisamos lidar com mais prefixos só precisamos modificar o grupo
(?:mc|mac)
, por exemplo, para adicionar prefixos francêsdu, de
:(?:mc|mac|du|de)
.Finalmente, podemos perceber que esse regex também corresponderá ao caso
MacDonald'S
anterior,'s
por isso precisamos lidar com ele no regex com um olhar negativo para trás(?<!'s\b)
. No final, temos:fonte
\b[ivxlcdm]+$|
assim é\b[ivxlcdm]+$|(?<=\b(?:mc|mac)?)[a-zA-Z](?<!'s\b)
. Ele fará maiúsculas todas as palavras finais de um nome que tenha um formato de número romano não estrito (ivxlcdm
). No entanto, você pode ter resultados indesejados, por exemplo, 'Li' se tornará 'LI'Regex.Replace("JOHN DOE".ToLower(), @"(?<=\b(?:mc|mac)?)[a-zA-Z](?<!'s\b)", m => m.Value.ToUpper())
Mc e Mac são prefixos de sobrenome comuns nos EUA, e existem outros. O TextInfo.ToTitleCase não trata desses casos e não deve ser usado para essa finalidade. Aqui está como eu estou fazendo isso:
fonte
ToTitleCase () deve funcionar para você.
http://support.microsoft.com/kb/312890
fonte
A opção mais direta será usar a função ToTitleCase disponível no .NET, que deve cuidar do nome na maioria das vezes. Como o edg apontou, existem alguns nomes para os quais ele não funcionará, mas esses são razoavelmente raros; portanto, a menos que você esteja direcionando uma cultura em que esses nomes sejam comuns, não é necessário algo com que você tenha que se preocupar muito.
No entanto, se você não estiver trabalhando com um idioma .NET, isso dependerá da aparência da entrada - se você tiver dois campos separados para o primeiro nome e o sobrenome, poderá colocar em maiúscula a primeira letra e diminuir o restante usando substrings.
No entanto, se você receber vários nomes como parte da mesma sequência, precisará saber como está obtendo as informações e dividi-las de acordo. Portanto, se você estiver recebendo um nome como "John Doe", divida a string com base no caractere de espaço. Se estiver em um formato como "Doe, John", será necessário dividi-lo com base na vírgula. No entanto, depois de dividir, basta aplicar o código mostrado anteriormente.
fonte
CultureInfo.CurrentCulture.TextInfo.ToTitleCase ("meu nome");
retorna ~ Meu nome
Mas o problema ainda existe com nomes como McFly, como afirmado anteriormente.
fonte
Eu uso meu próprio método para corrigir isso:
Por exemplo, a frase: "olá mundo. Olá, este é o mundo stackoverflow". será "Olá, mundo. Olá, este é o mundo do Stackoverflow". Regex \ b (início de uma palavra) \ w (primeiro caractere da palavra) fará o truque.
fonte
As sugestões para usar o ToTitleCase não funcionarão para seqüências de caracteres todas em maiúsculas. Então você precisará chamar o ToUpper no primeiro caractere e o ToLower nos caracteres restantes.
fonte
Esta classe faz o truque. Você pode adicionar novos prefixos à matriz de cadeias estáticas _prefixes .
fonte
Se você estiver usando o vS2k8, poderá usar um método de extensão para adicioná-lo à classe String:
fonte
Char.ToUpper(input[0]) + input.Substring(1)
é IMHO mais legível.input.FirstLetterToUpper()
é certamente mais legível vs.Char.ToUpper(input[0]) + input.Substring(1)
, mas menos transparente #Para contornar alguns dos problemas / problemas que foram destacados, sugiro converter a string para minúscula primeiro e depois chamar o método ToTitleCase. Você pode usar IndexOf ("Mc") ou IndexOf ("O \ '") para determinar casos especiais que precisam de atenção mais específica.
fonte
Eu gosto desta maneira:
Retirado deste artigo do MSDN .
fonte
Espero que isso ajude você.
fonte
fonte
Como edg indicado, você precisará de um algoritmo mais complexo para lidar com nomes especiais (é provavelmente por isso que muitos lugares forçam tudo a maiúsculas).
Algo como este c # não testado deve lidar com o caso simples que você solicitou:
fonte