Как сделать заглавными буквами первый символ каждого слова или первый символ целой строки с помощью C #? - PullRequest
57 голосов
/ 27 мая 2009

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

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

Примеры:

  • Способ превращения "Lorem Lipsum Et" в "Lorem lipsum Et"
  • Способ превращения "Lorem lipsum et" в "Lorem Lipsum Et"

Ответы [ 8 ]

111 голосов
/ 27 мая 2009

Как обсуждалось в комментариях к ответу @ 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") или "Намбла").

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

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 
30 голосов
/ 02 апреля 2015

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

string s = "the quick brown fox jumps over the lazy dog";
s = Regex.Replace(s, @"(^\w)|(\s\w)", m => m.Value.ToUpper());
13 голосов
/ 11 июля 2017

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

Определите функцию 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 !"
2 голосов
/ 27 мая 2009

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

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

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

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

1 голос
/ 24 октября 2014

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

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

«Где учиться в докторантуре в США»

или

"IRS Form UB40a"

Также при использовании CultureInfo.CurrentCulture.TextInfo.ToTitleCase (string) сохраняются слова в верхнем регистре, как в "спорт и 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", просто удалите их из строкового массива особых случаев. В разных организациях действуют разные правила капитализации.

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

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

0 голосов
/ 22 марта 2019

Похоже, что во всех примерах другие персонажи сначала опускаются, что мне не нужно.

customerName = CustomerName <- что я и хотел </p>

this is an example = This Is An Example

public static string ToUpperEveryWord(this string s)
{
    // Check for empty string.  
    if (string.IsNullOrEmpty(s))
    {
        return string.Empty;
    }

    var words = s.Split(' ');

    var t = "";
    foreach (var word in words)
    {
        t += char.ToUpper(word[0]) + word.Substring(1) + ' ';
    }
    return t.Trim();
}
0 голосов
/ 27 мая 2009

В .NET не существует готового решения для правильной языковой фиксации. Какая капитализация вы собираетесь? Соблюдаете ли вы чикагские соглашения по стилю? АМА или ОМС? Даже простая английская капитализация предложения имеет тысячи особых исключений для слов. Я не могу говорить о том, что делает гуманизированная ruby, но я думаю, что она, вероятно, не следует лингвистическим правилам капитализации и вместо этого делает что-то намного более простое.

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

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

0 голосов
/ 27 мая 2009

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

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

...