Отформатировать строку в заголовок

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

3.08.2008 16:03:48
19 ОТВЕТОВ

Вот простой статический метод для этого в C #:

public static string ToTitleCaseInvariant(string targetString)
{
    return System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(targetString);
}
16
3.08.2008 16:05:57
Недоступно в Silverlight. Смотрите другие ответы C #
Simon_Weaver 9.06.2010 04:22:58
Если это не самая длинная квалификация в истории ...Throw.In.Todays.News.While.Youre.At.It(...);
Thanatos 9.06.2010 04:27:50
Однако имейте в виду, что, если вся начальная строка имеет верхний регистр, вы должны String.ToLowerсначала вызвать ее , поскольку ToTitleCaseона не работает со всеми строками верхнего регистра.
Hans Olsson 13.12.2010 09:47:28
Как это инвариантно, если вы используете текущую культуру?
Matthew Flaschen 21.11.2011 01:01:55

Я был бы осторожен с автоматическим повышением точности всех слов, предшествующих пробелу, в сценариях, где я рискую привлечь ярость придира.

Я бы по крайней мере подумал о реализации словаря для исключительных случаев, таких как статьи и союзы. Вот:

"Красавица и чудовище"

И когда дело доходит до имен собственных, вещь становится намного ужаснее.

13
3.08.2008 19:14:31

Вот решение Perl http://daringfireball.net/2008/05/title_case

Вот решение для Ruby http://frankschmitt.org/projects/title-case

Вот одноруковое решение Ruby: http://snippets.dzone.com/posts/show/4702

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

То, что делает однострочный, использует подстановку регулярного выражения первого символа каждого слова его заглавной версией.

10
12.10.2008 12:20:29

Например, чтобы записать его в C, используйте коды ascii ( http://www.asciitable.com/ ), чтобы найти целочисленное значение char и вычесть 32 из него.

Это плохое решение, если вы когда-нибудь планируете принимать символы, отличные от аз и аз.

Например: ASCII 134: å, ASCII 143: Å.
Использование арифметики дает вам: ASCII 102: f

Используйте библиотечные вызовы, не думайте, что вы можете использовать целочисленную арифметику для своих персонажей, чтобы получить что-то полезное. Юникод это сложно .

8
7.08.2008 14:23:50

В Silverlight нет ToTitleCaseв TextInfoклассе.

Вот простой способ на основе регулярных выражений.

Примечание: Silverlight не имеет предварительно скомпилированных регулярных выражений, но для меня эта потеря производительности не является проблемой.

    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();
        });
    }
6
9.06.2010 04:39:28
Это отлично! Наконец, кое-что «простое», что я могу использовать в LightSwitch. Тем не менее, один маленький придурок. Это на самом деле правильный случай, а не заглавный. Можете ли вы придумать простой способ освободить его от таких вещей, как «а», «и т. Д.»? Правильный случай: это тестовый заголовок. Случай: это тестовый приговор
Yann Duran 24.08.2011 04:54:38
Извините, не удалось заставить "" производить новые строки.
Yann Duran 24.08.2011 05:01:45

В Perl:

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

Это даже в FAQ.

5
29.09.2008 22:35:06
Его больше нет в FAQ, потому что это неправильно. Подумайте о том, что это делает с схватками :)
brian d foy 6.10.2008 01:16:24

Если используемый вами язык имеет поддерживаемый метод / функцию, просто используйте его (как в ToTitleCaseметоде C # )

Если это не так, то вы захотите сделать что-то вроде следующего:

  1. Читать в строке
  2. Возьми первое слово
  3. Прописать первую букву этого слова 1
  4. Идите вперед и найдите следующее слово
  5. Перейдите к 3, если не в конце строки, иначе выйдите

1 Чтобы использовать его, скажем, на C, используйте коды ascii, чтобы найти целочисленное значение char и вычесть 32 из него.

В коде потребуется гораздо больше проверок на ошибки (обеспечение правильности букв и т. Д.), А функция «С заглавной буквы» должна будет навязывать буквы «своеобразной схеме», чтобы проверять слова, которые не нужны. быть в капитуляции («и», «но» и т. д. Вот хорошая схема)

5
9.02.2011 23:29:05
Абсолютно не работает с кодовыми таблицами, такими как, например, немецкий, где умляуты (äöü) имеют заглавные буквы, которые не следуют этому шаблону.
xmjx 29.09.2008 22:53:06

На каком языке?

В PHP это так:

ucwords ()

пример:

$HelloWorld = ucwords('hello world');
5
26.12.2011 17:11:26

В Java вы можете использовать следующий код.

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);
}
5
2.03.2016 10:32:44

Excel-подобный PROPER:

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;
}
4
8.10.2013 16:13:05

http://titlecase.com/имеет API

2
9.06.2010 04:09:49

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

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

1
9.06.2010 04:07:56

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

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

1
19.11.2012 07:59:34

Я думаю, что использование 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
8.10.2013 16:13:50

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

public static string ToTitleCaseInvariant(string str)
{
    return System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(str);
}
1
15.12.2017 11:54:52

В C #

using System.Globalization;  
using System.Threading;  
protected void Page_Load(object sender, EventArgs e)  
{  
  CultureInfo cultureInfo   = Thread.CurrentThread.CurrentCulture;  
  TextInfo textInfo = cultureInfo.TextInfo;  
  Response.Write(textInfo.ToTitleCase("WelcometoHome<br />"));  
  Response.Write(textInfo.ToTitleCase("Welcome to Home"));  
Response.Write(textInfo.ToTitleCase("Welcome@to$home<br/>").Replace("@","").Replace("$", ""));  
}
0
31.10.2019 12:21:40

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


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

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

-1
3.08.2008 16:25:07
Это не относится к случаю заголовка, где маленькие слова (статьи и предлоги) не должны начинаться с заглавной буквы.
brian d foy 6.10.2008 01:19:52

Здесь у вас есть версия 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;
}
-1
29.09.2008 23:27:40

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

my $tc_string = join ' ', map { ucfirst($\_) } split /\s+/, $string;
-1
9.02.2011 23:26:45
Это не относится к случаю заголовка, где маленькие слова (статьи и предлоги) не должны начинаться с заглавной буквы.
brian d foy 6.10.2008 01:18:04