Как прописать первый символ каждого слова или первый символ всей строки с помощью C#?



Я мог бы написать свой собственный алгоритм, чтобы сделать это, но я чувствую, что там должно быть эквивалентно Руби очеловечить в C#.



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



примеры:




  • способ превратить "Lorem Lipsum Et" в "Lorem lipsum et"

  • способ превратить "Lorem lipsum et" в "Lorem Lipsum Et"

562   7  

7 ответов:

как обсуждалось в комментариях @Мигеля!--5-->, вы можете использовать TextInfo.ToTitleCase который был доступен с .NET 1.1. Вот некоторый код, соответствующий вашему примеру:

string lipsum1 = "Lorem lipsum et";

// Creates a TextInfo based on the "en-US" culture.
TextInfo textInfo = new CultureInfo("en-US",false).TextInfo;

// Changes a string to titlecase.
Console.WriteLine("\"{0}\" to titlecase: {1}", 
                  lipsum1, 
                  textInfo.ToTitleCase( lipsum1 )); 

// Will output: "Lorem lipsum et" to titlecase: Lorem Lipsum Et

он будет игнорировать корпус вещи, которые все шапки, такие как" LOREM LIPSUM ET", потому что он заботится о случаях, если аббревиатуры в тексте (так что"англ" не стать "англ" и "англ").

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

string lipsum2 = "Lorem Lipsum Et";

string lipsum2lower = textInfo.ToLower(lipsum2);

string[] lipsum2split = lipsum2lower.Split(' ');

bool first = true;

foreach (string s in lipsum2split)
{
    if (first)
    {
        Console.Write("{0} ", textInfo.ToTitleCase(s));
        first = false;
    }
    else
    {
        Console.Write("{0} ", s);
    }
}

// Will output: Lorem lipsum et 

использовать регулярные выражения для этого выглядит намного чище:

string s = "the quick brown fox jumps over the lazy dog";
s = Regex.Replace(s, @"(^\w)|(\s\w)", m => m.Value.ToUpper());

есть еще одно элегантное решение :

определить функцию ToTitleCase на статический класс проект

using System.Globalization;

public static string ToTitleCase(this string title)
{
    return CultureInfo.CurrentCulture.TextInfo.ToTitleCase(title); 
}

а затем использовать его как расширение строки в любом месте вашего проекта:

"have a good day !".ToTitleCase() // "Have A Good Day !"

Если вы просто хотите использовать первый символ, просто вставьте его в свой собственный метод утилиты:

return string.IsNullOrEmpty(str) 
    ? str
    : str[0].ToUpperInvariant() + str.Substring(1).ToLowerInvariant();

существует также библиотечный метод Для заглавной буквы первого символа каждого слова:

http://msdn.microsoft.com/en-us/library/system.globalization.textinfo.totitlecase.aspx

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

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

"где изучать PHd курсы в США"

или

" форма IRS UB40a"

также с помощью CultureInfo.Свойства currentculture.TextInfo.ToTitleCase (string) сохраняет слова верхнего регистра, как в "спорт и MLB бейсбол", который становится" спорт и MLB бейсбол", но если вся строка помещается в верхний регистр, то это вызывает проблему.

поэтому я собрал простую функцию, которая позволяет сохранять прописные и смешанные падежные слова и делать маленькие слова строчными (если они не находятся в начале и конце фразы), включив их в специальные кейсы и строковые массивы в нижнем регистре:

public static string TitleCase(string value) {
        string titleString = ""; // destination string, this will be returned by function
        if (!String.IsNullOrEmpty(value)) {
            string[] lowerCases = new string[12] { "of", "the", "in", "a", "an", "to", "and", "at", "from", "by", "on", "or"}; // list of lower case words that should only be capitalised at start and end of title
            string[] specialCases = new string[7] { "UK", "USA", "IRS", "UCLA", "PHd", "UB40a", "MSc" }; // list of words that need capitalisation preserved at any point in title
            string[] words = value.ToLower().Split(' ');
            bool wordAdded = false; // flag to confirm whether this word appears in special case list
            int counter = 1;
            foreach (string s in words) {

                // check if word appears in lower case list
                foreach (string lcWord in lowerCases) {
                    if (s.ToLower() == lcWord) {
                        // if lower case word is the first or last word of the title then it still needs capital so skip this bit.
                        if (counter == 0 || counter == words.Length) { break; };
                        titleString += lcWord;
                        wordAdded = true;
                        break;
                    }
                }

                // check if word appears in special case list
                foreach (string scWord in specialCases) {
                    if (s.ToUpper() == scWord.ToUpper()) {
                        titleString += scWord;
                        wordAdded = true;
                        break;
                    }
                }

                if (!wordAdded) { // word does not appear in special cases or lower cases, so capitalise first letter and add to destination string
                    titleString += char.ToUpper(s[0]) + s.Substring(1).ToLower();
                }
                wordAdded = false;

                if (counter < words.Length) {
                    titleString += " "; //dont forget to add spaces back in again!
                }
                counter++;
            }
        }
        return titleString;
    }

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

Если вы хотите сохранить капитализацию меньших слов, таких как" a "и" of", просто удалите их из массива строк особых случаев. Разные организации имеют разные правила капитализации.

вы можете увидеть пример этого кода в действии на этой странице: Донорство Яйцеклеток Лондон - этот сайт автоматически создает иерархическую навигацию в верхней части страницы путем разбора URL-адрес, например "/услуги/Великобритания-яйцо-банка/введение" - затем в каждой папке имя в след дефисы заменяются пробелами и капитализирует имя папки, так СК-яйцо-Яйцо УК банка становится Банк. (сохраняя верхний регистр 'UK')

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

насколько я знаю, нет способа сделать это без написания (или шпаргалки) кода. C# nets (ха!) вы верхний, нижний и титульный (что у вас есть) случаи:

http://support.microsoft.com/kb/312890/EN-US/

нет готового решения для правильной лингвистической капитализации в. NET.какой тип капитализации вы собираетесь? Вы следуете Чикагскому руководству по стилю конвенций? АМА или МЛА? Даже простая английская капитализация предложения имеет 1000-е специальные исключения для слов. Я не могу говорить о том, что делает ruby's humanize, но я предполагаю, что он, вероятно, не следует лингвистическим правилам капитализации и вместо этого делает что-то намного проще.

внутренне, мы столкнулись с эта же проблема и должна была написать довольно большой объем кода только для обработки правильного (в нашем маленьком мире) корпуса названий статей, даже не учитывая капитализацию предложения. И это действительно становится "нечетким" :)

Это действительно зависит от того, что вам нужно, - почему вы пытаетесь преобразовать предложения в правильной капитализации (и в каком контексте)?

Comments

    Ничего не найдено.