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

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

Ответы [ 18 ]

16 голосов
/ 03 августа 2008

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

public static string ToTitleCaseInvariant(string targetString)
{
    return System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(targetString);
}
13 голосов
/ 03 августа 2008

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

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

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

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

10 голосов
/ 03 августа 2008

Вот решение 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}

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

8 голосов
/ 05 августа 2008

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

Это плохое решение, если вы планируете принимать символы за пределами a-z и A-Z.

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

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

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

В 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();
        });
    }
5 голосов
/ 03 августа 2008

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

В PHP это:

ucwords ()

пример:

$HelloWorld = ucwords('hello world');
5 голосов
/ 30 сентября 2008

В Perl:

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

Это даже в FAQ.

5 голосов
/ 03 августа 2008

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

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

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

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

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

5 голосов
/ 02 марта 2016

В 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);
}
4 голосов
/ 03 марта 2011

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