2009-05-26 4 views
48

Я мог бы написать свой собственный алгоритм, чтобы сделать это, но я считаю, что должен быть эквивалент ruby's humanize в C#.Как заглавнить первый символ каждого слова или первый символ целой строки с помощью C#?

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

Примеры:

  • способ превратить "Lorem Lipsum Et" в "Lorem Lipsum и др"
  • способ превратить "Lorem Lipsum и др" в "Lorem Lipsum Et"
+1

Мне нравится говорить Lorem Lipsum почему-то ^^ – marcgg

+3

Всегда есть регулярное выражение! Строка strToCap = strSource.ToLower(); Regex rCapitalize = new Regex ("(? <= [! \.?] \ S +) [A-Za-z]"); strToCap = rCapitalize.Replace (strToCap, m => {return m.Value.ToUpper();}); ... но тогда у вас возникли бы две проблемы.:) – rijipooh

+3

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

ответ

90

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

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

string lipsum2 = "Lorem Lipsum Et"; 

string lipsum2lower = textInfo.ToLower(lipsum1); 

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 
+0

как больше людей не знают об этом. Это блестяще построено в методе, спасибо – Coops

+2

Хаха 3 года спустя, и NAMBLA все еще заставляет меня смеяться, ах и +1 для ToTitleCase() –

+1

Найденный вопрос с ToTitleCase 1st станет 1St. –

2

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

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

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

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

+0

Это просто даст вам название: «Lorem Ipsum Et», а не предложение: «Lorem ipsum et», верно? – vinny

+0

Я думаю, что делает наоборот. –

+0

Я думал об этом, но ToTitleCase - это противоположность тому, что хочет OP. –

0

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

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

0

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

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

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

0

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

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

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

или

"Форма IRS UB40a"

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

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

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

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

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

19

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

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

Расширение ответа: Строка s = «Быстрое bRown fOx juMps over tEe LAzy doG»; s = Regex.Replace (s.ToLower(), @ "(^ \ w) | (\ s \ w)", m => m.Value.ToUpper()); – mcandal

2

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

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

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 !" 
Смежные вопросы