Подтвердить что ты не робот

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

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

Я искал его, но нашел способы очертить даты.

Примеры:

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

Ответ 1

Как уже говорилось в комментариях к ответу @miguel, вы можете использовать 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", потому что он заботится о случаях, когда аббревиатуры есть в тексте (так что " NAMBLA " не станет "nambla" или "Nambla").

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

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 

Ответ 2

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

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

Ответ 3

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

Определите функцию ToTitleCase в статическом классе вашего проекта

using System.Globalization;

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

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

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

Ответ 4

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

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

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

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

Ответ 5

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

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

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

или

"Форма IRS UB40a"

Также использование CultureInfo.CurrentCulture.TextInfo.ToTitleCase(строка) сохраняет слова верхнего регистра, как в "спорт и бейсбол MLB", который становится "Sports And MLB Baseball", но если вся строка помещается в верхний регистр, это вызывает проблему.

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

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", а затем просто удалите их из массива строк специальных случаев. Различные организации имеют разные правила капитализации.

Вы можете увидеть пример этого кода в действии на этом сайте: The Egg Donation London - этот сайт автоматически создает дорожки для сухарей в верхней части страницы, анализируя URL-адрес, например "/services/uk-egg-bank/introduction", - тогда каждое имя папки в трейле заменяет дефисы пробелами и заглаживает имя папки, поэтому uk-egg-bank становится UK Egg Bank. (сохраняя верхний регистр "UK" )

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

Ответ 6

Насколько я знаю, не существует способа сделать это без написания кода. С# сети (ha!) Вы имеете верхний, нижний и заголовок (что у вас есть):

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

Ответ 7

В .NET нет готового решения для правильной лингвистической capticization. Какую капитализацию вы собираетесь совершить? Вы следуете правилам Chicago Manual of Style? AMA или MLA? Даже простая английская английская фраза имеет 1000 специальных исключений для слов. Я не могу говорить о том, что делает рубиновая гуманизация, но я полагаю, что это, вероятно, не соответствует лингвистическим правилам капитализации и вместо этого делает что-то намного проще.

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

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