Как прописать первый символ каждого слова или первый символ всей строки с помощью C#?
Я мог бы написать свой собственный алгоритм, чтобы сделать это, но я чувствую, что там должно быть эквивалентно Руби очеловечить в C#.
я погуглил его, но только нашел способы гуманизировать даты.
примеры:
- способ превратить "Lorem Lipsum Et" в "Lorem lipsum et"
- способ превратить "Lorem lipsum et" в "Lorem Lipsum Et"
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 (ха!) вы верхний, нижний и титульный (что у вас есть) случаи:
нет готового решения для правильной лингвистической капитализации в. NET.какой тип капитализации вы собираетесь? Вы следуете Чикагскому руководству по стилю конвенций? АМА или МЛА? Даже простая английская капитализация предложения имеет 1000-е специальные исключения для слов. Я не могу говорить о том, что делает ruby's humanize, но я предполагаю, что он, вероятно, не следует лингвистическим правилам капитализации и вместо этого делает что-то намного проще.
внутренне, мы столкнулись с эта же проблема и должна была написать довольно большой объем кода только для обработки правильного (в нашем маленьком мире) корпуса названий статей, даже не учитывая капитализацию предложения. И это действительно становится "нечетким" :)
Это действительно зависит от того, что вам нужно, - почему вы пытаетесь преобразовать предложения в правильной капитализации (и в каком контексте)?
Comments