Pergunta

Como faço para formatar uma string para maiúsculas e minúsculas?

Nenhuma solução correta

Outras dicas

Aqui está um método estático simples para fazer isso em C#:

public static string ToTitleCaseInvariant(string targetString)
{
    return System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(targetString);
}

Eu teria cuidado ao aumentar automaticamente todas as palavras precedidas de espaços em branco em cenários em que correria o risco de atrair a fúria dos críticos.

Eu consideraria pelo menos implementar um dicionário para casos de exceção, como artigos e conjunções.Contemplar:

"A bela e a fera"

E quando se trata de nomes próprios, a coisa fica muito mais feia.

Aqui está uma solução Perl http://daringfireball.net/2008/05/title_case

Aqui está uma solução Ruby http://frankschmitt.org/projects/title-case

Aqui está uma solução Ruby de uma linha: http://snippets.dzone.com/posts/show/4702

'some string here'.gsub(/\b\w/){$&.upcase}

O que o one-liner está fazendo é usar uma substituição de expressão regular do primeiro caractere de cada palavra pela versão maiúscula dela.

Para capatilizá-lo em, digamos, C - use os códigos ascii (http://www.asciitable.com/) para encontrar o valor inteiro do caractere e subtrair 32 dele.

Esta é uma solução ruim se você planeja aceitar caracteres além de az e AZ.

Por exemplo:ASCII 134:sim, ASCII 143:A.
Usar aritmética permite que você:ASCII 102:f

Use chamadas de biblioteca, não presuma que você pode usar aritmética inteira em seus personagens para recuperar algo útil.Unicode é complicado.

No Silverlight não há ToTitleCase no TextInfo aula.

Aqui está uma maneira simples baseada em regex.

Observação:O Silverlight não possui expressões regulares pré-compiladas, mas para mim essa perda de desempenho não é um problema.

    public string TitleCase(string str)
    {
        return Regex.Replace(str, @"\w+", (m) =>
        {
            string tmp = m.Value;
            return char.ToUpper(tmp[0]) + tmp.Substring(1, tmp.Length - 1).ToLower();
        });
    }

Em Perl:

$string =~ s/(\w+)/\u\L$1/g;

Isso está até no FAQ.

Se a linguagem que você está usando tiver um método/função compatível, basta usá-lo (como no C# ToTitleCase método)

Caso contrário, você desejará fazer algo como o seguinte:

  1. Leia na string
  2. Pegue a primeira palavra
  3. Coloque a primeira letra dessa palavra em maiúscula 1
  4. Vá em frente e encontre a próxima palavra
  5. Vá para 3 se não estiver no final da string, caso contrário, saia

1 Para capitalizá-lo em, digamos, C - use o códigos ascii para encontrar o valor inteiro do caractere e subtrair 32 dele.

Seria necessário haver muito mais verificação de erros no código (garantindo letras válidas, etc.), e a função "Capitalizar" precisará impor algum tipo de "esquema de maiúsculas e minúsculas" nas letras para verificar palavras que não precisam para ser capatilizado ('e', 'mas' etc. Aqui é um bom esquema)

Em que língua?

Em PHP é:

ucpalavras()

exemplo:

$HelloWorld = ucwords('hello world');

Em Java, você pode usar o código a seguir.

public String titleCase(String str) {
    char[] chars = str.toCharArray();
    for (int i = 0; i < chars.length; i++) {
        if (i == 0) {
            chars[i] = Character.toUpperCase(chars[i]);
        } else if ((i + 1) < chars.length && chars[i] == ' ') {
            chars[i + 1] = Character.toUpperCase(chars[i + 1]);
        }
    }
    return new String(chars);
}

PROPER semelhante ao Excel:

public static string ExcelProper(string s) {
    bool upper_needed = true;
    string result = "";
    foreach (char c in s) {
        bool is_letter = Char.IsLetter(c);
        if (is_letter)
            if (upper_needed)
                result += Char.ToUpper(c);
            else
                result += Char.ToLower(c);
        else
            result += c;
        upper_needed = !is_letter;
    }
    return result;
}

http://titlecase.com/ tem um API

Existe uma fórmula embutida PROPER(n) no Excel.

Fiquei muito satisfeito em ver que não precisei escrever sozinho!

Aqui está uma implementação em Python: https://launchpad.net/titlecase.py

E um port dessa implementação que acabei de fazer em C++: http://codepad.org/RrfcsZzO

Acho que usar CultureInfo nem sempre é confiável, esta é a maneira simples e prática de manipular strings manualmente:

string sourceName = txtTextBox.Text.ToLower();
string destinationName = sourceName[0].ToUpper();

for (int i = 0; i < (sourceName.Length - 1); i++) {
  if (sourceName[i + 1] == "")  {
    destinationName += sourceName[i + 1];
  }
  else {
    destinationName += sourceName[i + 1];
  }
}
txtTextBox.Text = desinationName;

Aqui está um exemplo simples de como fazer isso:

public static string ToTitleCaseInvariant(string str)
{
    return System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(str);
}

Sem usar uma função pronta, um algoritmo super simples de baixo nível para converter uma string em maiúsculas e minúsculas:


convert first character to uppercase.
for each character in string,
    if the previous character is whitespace,
        convert character to uppercase.

Isso pressupõe que "converter caractere em maiúsculas" fará isso corretamente, independentemente de o caracter diferenciar maiúsculas de minúsculas ou não (por exemplo, '+').

Aqui você tem uma versão C++.Possui um conjunto de palavras que não podem ser maiúsculas, como pronomes e preposições.No entanto, eu não recomendaria automatizar esse processo se você estiver lidando com textos importantes.

#include <iostream>
#include <string>
#include <vector>
#include <cctype>
#include <set>

using namespace std;

typedef vector<pair<string, int> > subDivision;
set<string> nonUpperCaseAble;

subDivision split(string & cadena, string delim = " "){
    subDivision retorno;
    int pos, inic = 0;
    while((pos = cadena.find_first_of(delim, inic)) != cadena.npos){
        if(pos-inic > 0){
            retorno.push_back(make_pair(cadena.substr(inic, pos-inic), inic));
        }
        inic = pos+1;
    }
    if(inic != cadena.length()){
        retorno.push_back(make_pair(cadena.substr(inic, cadena.length() - inic), inic));
    }
    return retorno;
}

string firstUpper (string & pal){
    pal[0] = toupper(pal[0]);
    return pal;
}

int main()
{
    nonUpperCaseAble.insert("the");
    nonUpperCaseAble.insert("of");
    nonUpperCaseAble.insert("in");
    // ...

    string linea, resultado;
    cout << "Type the line you want to convert: " << endl;
    getline(cin, linea);

    subDivision trozos = split(linea);
    for(int i = 0; i < trozos.size(); i++){
        if(trozos[i].second == 0)
        {
            resultado += firstUpper(trozos[i].first);
        }
        else if (linea[trozos[i].second-1] == ' ')
        {
            if(nonUpperCaseAble.find(trozos[i].first) == nonUpperCaseAble.end())
            {
                resultado += " " + firstUpper(trozos[i].first);
            }else{
                resultado += " " + trozos[i].first;
            }
        }
        else
        {
            resultado += trozos[i].first;
        }       
    }

    cout << resultado << endl;
    getchar();
    return 0;
}

Com perl você poderia fazer isso:

my $tc_string = join ' ', map { ucfirst($\_) } split /\s+/, $string;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top