Domanda

Come faccio a formattare una stringa in caso del titolo?

Nessuna soluzione corretta

Altri suggerimenti

Ecco un semplice metodo statico per farlo in C#:

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

Sarei cauto nell'incrementare automaticamente tutte le parole precedute da spazi bianchi in scenari in cui correrei il rischio di attirare la furia dei pignoli.

Prenderei almeno in considerazione l'implementazione di un dizionario per casi eccezionali come articoli e congiunzioni.Ecco:

"La bella e la bestia"

E quando si tratta di nomi propri la cosa si fa ancora più brutta.

Ecco una soluzione Perl http://daringfireball.net/2008/05/title_case

Ecco una soluzione Ruby http://frankschmitt.org/projects/title-case

Ecco una soluzione Ruby one-liner: http://snippets.dzone.com/posts/show/4702

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

Ciò che fa la riga è utilizzare un'espressione regolare che sostituisce il primo carattere di ogni parola con la sua versione maiuscola.

Per capitalizzarlo, ad esempio, in C, utilizzare i codici ascii (http://www.asciitable.com/) per trovare il valore intero del carattere e sottrarre 32 da esso.

Questa è una soluzione scadente se prevedi di accettare caratteri oltre la A-Z e la A-Z.

Ad esempio:ASCII134:å, ASCII 143:UN.
Usare l'aritmetica ti dà:ASCII102:F

Usa le chiamate in libreria, non dare per scontato che puoi usare l'aritmetica dei numeri interi sui tuoi personaggi per ottenere qualcosa di utile.Unicode lo è scaltro.

In Silverlight non c'è ToTitleCase nel TextInfo classe.

Ecco un semplice metodo basato su regex.

Nota:Silverlight non ha espressioni regolari precompilate, ma per me questa perdita di prestazioni non è un 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();
        });
    }

In Perl:

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

Questo è anche nelle FAQ.

Se il linguaggio che stai utilizzando ha un metodo/funzione supportato, usa semplicemente quello (come nel C# ToTitleCase metodo)

In caso contrario, ti consigliamo di fare qualcosa di simile al seguente:

  1. Leggi nella stringa
  2. Prendi la prima parola
  3. Scrivi in ​​maiuscolo la prima lettera di quella parola 1
  4. Vai avanti e trova la parola successiva
  5. Vai a 3 se non alla fine della stringa, altrimenti esci

1 Per scrivere in maiuscolo, ad esempio C, utilizzare il file codici ascii per trovare il valore intero del carattere e sottrarre 32 da esso.

Ci sarebbe bisogno di molto più controllo degli errori nel codice (garantendo lettere valide, ecc.), e la funzione "Capitale" dovrà imporre una sorta di "schema titolo-maiuscolo" sulle lettere per verificare le parole che non necessitano essere maiuscolo ("e", "ma" ecc. Qui è un buon schema)

In quale lingua?

In PHP è:

ucwords()

esempio:

$HelloWorld = ucwords('hello world');

In Java è possibile utilizzare il seguente codice.

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);
}

Corretto come 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/ ha un API

C'è una formula incorporata PROPER(n) in Excel.

Mi ha fatto molto piacere vedere che non dovevo scriverlo da solo!

Ecco un'implementazione in Python: https://launchpad.net/titlecase.py

E un port di questa implementazione che ho appena realizzato in C++: http://codepad.org/RrfcsZzO

Penso che l'utilizzo di CultureInfo non sia sempre affidabile, questo è il modo semplice e pratico per manipolare manualmente la stringa:

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;

Ecco un semplice esempio di come farlo:

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

Senza utilizzare una funzione già pronta, un semplicissimo algoritmo di basso livello per convertire una stringa in maiuscole:


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

Ciò presuppone che "converti carattere in maiuscolo" lo farà correttamente indipendentemente dal fatto che il carattere faccia o meno distinzione tra maiuscole e minuscole (ad esempio "+").

Qui hai una versione C++.Ha un insieme di parole non maiuscole come pronomi e preposizioni.Tuttavia, non consiglierei di automatizzare questo processo se hai a che fare con testi importanti.

#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;
}

Con Perl potresti fare questo:

my $tc_string = join ' ', map { ucfirst($\_) } split /\s+/, $string;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top