language agnostic - Formater la chaîne en casse de titre

Translate

Comment formater une chaîne encasse du titre?

This question and all comments follow the "Attribution Required."

Toutes les réponses

Translate

Voici une méthode statique simple pour faire cela en C #:

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

Je me méfierais de la mise à jour automatique de tous les mots précédés d'espaces blancs dans des scénarios où je risquerais d'attirer la fureur des nitpickers.

J'envisagerais au moins d'implémenter un dictionnaire pour les cas d'exception comme les articles et les conjonctions. Voir:

"La belle et la Bête"

Et quand il s'agit de noms propres, la chose devient beaucoup plus moche.

La source
Translate

Voici une solution Perlhttp://daringfireball.net/2008/05/title_case

Voici une solution Rubyhttp://frankschmitt.org/projects/title-case

Voici une solution Ruby one-liner:http://snippets.dzone.com/posts/show/4702

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

Ce que fait le one-liner est d'utiliser une substitution d'expression régulière du premier caractère de chaque mot par la version majuscule de celui-ci.

La source
Translate

Pour le capatiliser en, disons, C - utilisez les codes ascii (http://www.asciitable.com/) pour trouver la valeur entière du caractère et en soustraire 32.

C'est une mauvaise solution si vous prévoyez d'accepter des caractères au-delà de az et AZ.

Par exemple: ASCII 134: å, ASCII 143: Å.
L'utilisation de l'arithmétique vous permet d'obtenir: ASCII 102: f

Utilisez des appels de bibliothèque, ne supposez pas que vous pouvez utiliser l'arithmétique d'entiers sur vos caractères pour récupérer quelque chose d'utile. Unicode estrusé.

La source
Translate

Dans Silverlight il n'y a pasToTitleCasedans leTextInfoclasse.

Voici une méthode simple basée sur les regex.

Remarque: Silverlight n'a pas d'expressions régulières précompilées, mais pour moi, cette perte de performances n'est pas un problème.

    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();
        });
    }
La source
Translate

En Perl:

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

C'est même dans la FAQ.

La source
Translate

Si le langage que vous utilisez a une méthode / fonction prise en charge, utilisez-la simplement (comme dans le C #ToTitleCaseméthode)

Si ce n'est pas le cas, vous voudrez faire quelque chose comme ce qui suit:

  1. Lire dans la chaîne
  2. Prends le premier mot
  3. Mettre en majuscule la première lettre de ce mot1
  4. Avancez et trouvez le mot suivant
  5. Aller à 3 sinon à la fin de la chaîne, sinon quitter

1Pour le mettre en majuscule, disons, C - utilisez lecodes asciipour trouver la valeur entière du caractère et en soustraire 32.

Il faudrait beaucoup plus de vérification des erreurs dans le code (s'assurer que les lettres sont valides, etc.), et la fonction "Capitaliser" devra imposer une sorte de "schéma de casse du titre" sur les lettres pour vérifier les mots qui n'en ont pas besoin être capatilisé ('et', 'mais' etc.Iciest un bon schéma)

La source
Translate

Dans quelle langue?

En PHP c'est:

ucwords ()

exemple:

$HelloWorld = ucwords('hello world');
La source
Translate

En Java, vous pouvez utiliser le code suivant.

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);
}
La source
Translate

BIEN comme 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;
}
La source
Translate

/out/aHR0cDovL3RpdGxlY2FzZS5jb20=/a unAPI

La source
Translate

Il existe une formule intégréePROPER(n)dans Excel.

J'étais très content de voir que je n'avais pas à l'écrire moi-même!

La source
Translate

Voici une implémentation en Python:https://launchpad.net/titlecase.py

Et un portage de cette implémentation que je viens de faire en C ++:http://codepad.org/RrfcsZzO

La source
Translate

Je pense que l'utilisation de CultureInfo n'est pas toujours fiable, c'est le moyen simple et pratique de manipuler la chaîne manuellement:

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;
La source
Translate

Voici un exemple simple de la façon de procéder:

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

Sans utiliser de fonction prête à l'emploi, un algorithme de bas niveau super simple pour convertir une chaîne en casse de titre:


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

Cela suppose que la «conversion du caractère en majuscule» le fera correctement, que le caractère soit sensible à la casse ou non (par exemple, «+»).

La source
Translate

Ici vous avez une version C ++. Il contient un ensemble de mots non majuscules tels que prononuns et prépositions. Cependant, je ne recommanderais pas d'automatiser ce processus si vous devez traiter des textes importants.

#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;
}
La source
Rose Lee
Translate

Avec perl, vous pouvez faire ceci:

my $tc_string = join ' ', map { ucfirst($\_) } split /\s+/, $string;
La source