string de formato para caso de título

votos
24

Como faço para formatar uma string para caso de título ?

Publicado 03/08/2008 em 17:03
fonte usuário
Em outras línguas...                            


18 respostas

votos
16

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

public static string ToTitleCaseInvariant(string targetString)
{
    return System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(targetString);
}
Respondeu 03/08/2008 em 17:05
fonte usuário

votos
13

Eu seria cauteloso em upcasing automaticamente todas as palavras-precedido por espaços em branco em cenários onde eu correria o risco de atrair a fúria de nitpickers.

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

"Bela e A Fera"

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

Respondeu 03/08/2008 em 20:10
fonte usuário

votos
10

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

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

Aqui está uma solução one-liner Ruby: http://snippets.dzone.com/posts/show/4702

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

O que o one-liner está fazendo é usando uma substituição de expressão regular do primeiro caractere de cada palavra com a versão em maiúsculas do mesmo.

Respondeu 03/08/2008 em 19:22
fonte usuário

votos
8

Para capatilise-lo em, digamos, C - utilizar os códigos ASCII ( http://www.asciitable.com/ ) para encontrar o valor inteiro do caractere e subtrair 32 a partir dele.

Esta é uma má solução, se você tiver algum plano para aceitar caracteres além az e AZ.

Por exemplo: ASCII 134: A, ASCII 143: a.
Usando aritmética você recebe: ASCII 102: f

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

Respondeu 04/08/2008 em 22:16
fonte usuário

votos
6

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);
}
Respondeu 02/03/2016 em 10:32
fonte usuário

votos
6

No Silverlight não existe ToTitleCasena TextInfoclasse.

Aqui está uma maneira baseada regex simples.

Nota: O Silverlight não tem expressões regulares pré-compilados, mas para mim esta 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();
        });
    }
Respondeu 09/06/2010 em 05:24
fonte usuário

votos
5

Em Perl:

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

Isso é mesmo no FAQ.

Respondeu 29/09/2008 em 23:35
fonte usuário

votos
5

Se o idioma que você está usando tem um método / função suportada em seguida, basta usar isso (como no C # ToTitleCasemétodo)

Se isso não acontecer, então você vai querer fazer algo como o seguinte:

  1. Leia na cadeia
  2. Tome a primeira palavra
  3. Capitalizar a primeira letra da palavra 1
  4. Vá em frente e encontrar a próxima palavra
  5. Ir para 3 se não no final da cadeia, caso contrário saída

1 Para capitalizar-lo em, digamos, C - utilizar os códigos ASCII para encontrar o valor inteiro do caractere e subtrair 32 a partir dele.

Não precisaria ser muito mais verificação de erros no código (garantindo cartas válidas etc.), ea função "Capitalize" terá de impor algum tipo de "esquema título caso" nas letras para verificar se há palavras que não precisam a ser capatilised ( 'e' 'mas' etc. Aqui é um bom esquema)

Respondeu 03/08/2008 em 17:33
fonte usuário

votos
5

Em que língua?

Em PHP é:

ucwords ()

exemplo:

$HelloWorld = ucwords('hello world');
Respondeu 03/08/2008 em 17:12
fonte usuário

votos
4

Excel-like ADEQUADO:

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;
}
Respondeu 02/03/2011 em 23:29
fonte usuário

votos
2

http://titlecase.com/tem uma API

Respondeu 09/06/2010 em 05:09
fonte usuário

votos
1

Aqui está um exemplo simples de como fazê-lo:

public static string ToTitleCaseInvariant(string str)
{
    return System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(str);
}
Respondeu 15/12/2017 em 11:54
fonte usuário

votos
1

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

E uma porta de esta implementação que eu acabei de fazer em C ++: http://codepad.org/RrfcsZzO

Respondeu 19/11/2012 em 08:59
fonte usuário

votos
1

Há uma fórmula built-in PROPER(n)no Excel.

Foi bastante satisfeitos em ver que eu não tinha que escrevê-lo eu mesmo!

Respondeu 09/06/2010 em 05:07
fonte usuário

votos
1

Acho que usando o CultureInfo nem sempre é confiável, este o da maneira simples e acessível para manipular seqüência 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;
Respondeu 07/12/2009 em 17:56
fonte usuário

votos
-1

Aqui você tem uma versão C ++. Tem um conjunto de palavras não uppercaseable como prononuns e preposições. No entanto, eu não recomendaria automatizar esse processo se está a lidar 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;
}
Respondeu 30/09/2008 em 00:27
fonte usuário

votos
-1

Com perl você poderia fazer isso:

my $tc_string = join ' ', map { ucfirst($\_) } split /\s+/, $string;
Respondeu 16/09/2008 em 12:11
fonte usuário

votos
-1

Sem o uso de uma função de ready-made, um algoritmo de baixo nível super-simples para converter uma string para caso de título:


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

Este asssumes a "converter caracteres para maiúsculas" vai fazer isso corretamente, independentemente de haver ou não o personagem é sensível a maiúsculas (por exemplo, '+').

Respondeu 03/08/2008 em 17:25
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more