Заглавная буква в каждом слове

250
06 января 2018, 00:18

Задание такое: Создать программу, состоящую из textBox и кнопки. В textBox вводятся любые слова в любом регистре, по нажатию на кнопку происходит запись в файл содержимого textBox с исправленным регистром. Каждое новое слово начинается с большой буквы, все остальные буквы маленькие.

Пример

Ввод: пРиВеТ, мЕНя ЗОвут МАРИНА.

Вывод: Привет, Меня Зовут Марина.

С файлом все понятно, как его создавать и записывать знаю. Расскажите пожалуйста как сделать такое исправление регистра или дайте пример. Буду очень благодарен.

Answer 1

Как выяснилось при поиске, есть готовый метод System.Globalization.TextInfo.ToTitleCase, который приводит текст к нужному виду. Одна проблема, слова состоящие полностью из заглавных букв он воспринимает как аббревиатуры и пропускает.

Generally, title casing converts the first character of a word to uppercase and the rest of the characters to lowercase. However, this method does not currently provide proper casing to convert a word that is entirely uppercase, such as an acronym.

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

//директива using
using System.Globalization;
...
var text = "пРиВеТ, мЕНя ЗОвут МАРИНА.";
//получаем TextInfo для русского языка
var textInfo = new CultureInfo("ru-RU").TextInfo;
//преобразуем текст
var capitalizedText = textInfo.ToTitleCase(textInfo.ToLower(text));
Console.WriteLine(capitalizedText);

Получаем:

Привет, Меня Зовут Марина.

Обратите внимание на то, что:

  • аббревиатуры будут преобразованы: «ФСБ» превратиться в «Фсб»;
  • границы слов определяются по небуквенным символам: «где-то» превратиться в «Где-То»;
  • правила капитализации зависят от локали. В примере выше используется локаль ru-RU. При необходимости учитывать правила капитализации для других языков/регионов, потребуются изменения в инициализации TextInfo.

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

A linguistically correct solution would require additional rules, and the current algorithm is somewhat simpler and faster. We reserve the right to make this API slower in the future.

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

Другие варианты в таком же вопросе на английском: Capitalizing words in a string using c#.

Answer 2

Например, так:

static string CapitalizeAllWords(string s)
{
    var sb = new StringBuilder(s.Length);
    bool inWord = false;
    foreach(var c in s)
    {
        if (char.IsLetter(c))
        {
            sb.Append(inWord ? char.ToLower(c) : char.ToUpper(c));
            inWord = true;
        }
        else
        {
            sb.Append(c);
            inWord = false;
        }
    }
    return sb.ToString();
}

Пример использования:

Console.WriteLine(CapitalizeAllWords("пРиВеТ, мЕНя ЗОвут МАРИНА."));

То же самое в linq, как мы все любим:

static string CapitalizeAllWords(string s)
{
    bool inWord = false;
    return new string(
        s.Select(c => (
            c: char.IsLetter(c) ? (inWord ? char.ToLower(c) : char.ToUpper(c)) : c,
            inWord = char.IsLetter(c)).c)
         .ToArray());
}

Этот вариант, конечно же, шуточный, и использовать его не стоит

Answer 3

Как вариант можно так попробовать

string TextBoxText = "hello world my name is hitler";
            var result = TextBoxText.Split(' ').ToList();
            var t = new List<string>();
            result.ForEach(g =>
            {
                t.Add(g.Replace(g[0].ToString(), g[0].ToString().ToUpper()));
            });

Как бы работает нормально

Answer 4

Лучше использовать StringBuilder, так как придется изменять строку.

StringBuilder s = new StringBuilder("пРиВеТ, мЕНя ЗОвут МАРИНА.");
s[0] = char.ToUpper(s[0]); //Приведение к верхнему регистру
s[1] = char.ToLower(s[1]); // Приведение к нижнему регистру

Результат будет -> "ПриВеТ, мЕНя ЗОвут МАРИНА."

READ ALSO
Как выполнять код отдельно от форм

Как выполнять код отдельно от форм

Изначально, когда создаешь проект (а именно Приложение Windows Forms), доступен для редактирования файл Form1cs

250
Обработка исключений другого потока

Обработка исключений другого потока

В ViewModel имеется команда, которая запускает загрузку данных с порта и расшифровку их:

222
Импорт и экспорт в xml , json, yml [требует правки]

Импорт и экспорт в xml , json, yml [требует правки]

Необходимо экспортировать и импортировать в три формата (xml , json, yml)Как лучше это сделать? Помогите с примером и советом

182