Форматировать строку в заголовок - PullRequest
25 голосов
/ 03 августа 2008

Как мне отформатировать строку в регистр заголовка ?

Ответы [ 18 ]

2 голосов
/ 09 июня 2010
1 голос
/ 09 июня 2010

В Excel есть встроенная формула PROPER(n).

Было очень приятно видеть, что мне не пришлось писать это самому!

1 голос
/ 07 декабря 2009

Я думаю, что использование CultureInfo не всегда надежно, это простой и удобный способ манипулирования строкой вручную:

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;
1 голос
/ 15 декабря 2017

Вот простой пример того, как это сделать:

public static string ToTitleCaseInvariant(string str)
{
    return System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(str);
}
1 голос
/ 19 ноября 2012

Вот реализация на Python: https://launchpad.net/titlecase.py

И порт этой реализации, который я только что сделал в C ++: http://codepad.org/RrfcsZzO

0 голосов
/ 30 сентября 2008

Здесь у вас есть версия C ++. У него есть набор не прописных слов, таких как пронунун и предлоги. Однако я не рекомендовал бы автоматизировать этот процесс, если вы имеете дело с важными текстами.

#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;
}
0 голосов
/ 03 августа 2008

Без использования готовой функции, супер-простой низкоуровневый алгоритм для преобразования строки в регистр заголовка:

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

Это предполагает, что "преобразовать символ в верхний регистр" будет делать это правильно независимо от того, является ли символ чувствительным к регистру (например, '+').

0 голосов
/ 16 сентября 2008

С Perl вы можете сделать это:

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