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

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

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

Примеры:

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

7 ответов

Решение

Как указано в комментариях к ответу @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 

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

Определить функцию 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 !"

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

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

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

customerName знак равно CustomerName <- Что я и хотел

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();
}

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

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 в порядке, но только изменяет представление строки в браузере. Лучший способ - сделать сам текст заглавными перед отправкой в ​​браузер.

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

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

или же

"IRS Form UB40a"

Также использование CultureInfo.CurrentCulture.TextInfo.ToTitleCase(string) сохраняет слова в верхнем регистре, как в "sports and MLB baseball", который становится "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')

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

Я добился того же, используя собственные методы расширения. Для первой буквы первой подстроки используйте методyourString.ToFirstLetterUpper(). Для первой буквы каждой подстроки, за исключением статей и некоторых предложений, используйте методyourString.ToAllFirstLetterInUpper(). Ниже представлена ​​консольная программа:

class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("this is my string".ToAllFirstLetterInUpper());
            Console.WriteLine("uniVersity of lonDon".ToAllFirstLetterInUpper());
        }
    }

    public static class StringExtension
    {
        public static string ToAllFirstLetterInUpper(this string str)
        {
            var array = str.Split(" ");

            for (int i = 0; i < array.Length; i++)
            {
                if (array[i] == "" || array[i] == " " || listOfArticles_Prepositions().Contains(array[i])) continue;
                array[i] = array[i].ToFirstLetterUpper();
            }
            return string.Join(" ", array);
        }

        private static string ToFirstLetterUpper(this string str)
        {
            return str?.First().ToString().ToUpper() + str?.Substring(1).ToLower();
        }

        private static string[] listOfArticles_Prepositions()
        {
            return new[]
            {
                "in","on","to","of","and","or","for","a","an","is"
            };
        }
    }

ВЫХОД

This is My String
University of London
Process finished with exit code 0.

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

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

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

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

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

Другие вопросы по тегам