метод 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»)
Расширение этого кода может заключаться в том, чтобы иметь таблицу поиска сокращений и прописных или строчных слов в общем текстовом файле, таблице базы данных или веб-службе, чтобы список смешанного случая слова могут поддерживаться из одного места и применяться ко многим различным приложениям, которые полагаются на функцию.
Мне нравится говорить Lorem Lipsum почему-то ^^ – marcgg
Всегда есть регулярное выражение! Строка strToCap = strSource.ToLower(); Regex rCapitalize = new Regex ("(? <= [! \.?] \ S +) [A-Za-z]"); strToCap = rCapitalize.Replace (strToCap, m => {return m.Value.ToUpper();}); ... но тогда у вас возникли бы две проблемы.:) – rijipooh
Поскольку принятый ответ ссылается на код, который делает противоположное тому, что задавал первоначальный вопрос, я отредактировал вопрос, чтобы задать оба направления, в надежде, что этот вопрос не будет совершенно путать для будущих пользователей, которые наткнуться на него. –