Как использовать имена

так что в основном, если я хочу преобразовать имя из

stephen smith 

к

Stephen Smith

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

есть ли функция для этого?

Ответ 1

Вы можете сделать это, используя метод ToTitleCase System.Globalization.TextInfo класс:

CultureInfo cultureInfo   = Thread.CurrentThread.CurrentCulture;
TextInfo textInfo = cultureInfo.TextInfo;

Console.WriteLine(textInfo.ToTitleCase(title));
Console.WriteLine(textInfo.ToLower(title));
Console.WriteLine(textInfo.ToUpper(title));

Ответ 2

Имена сложны. Простые правила первых букв не применяются. Единственный подход сенатора - попросить ваших пользователей, как они этого хотят. Все остальное может стать преступлением.

Если меня зовут MacPhearson, ODowel или просто marc, Marc или даже mArC - тогда, честно говоря, оставьте это в покое. Доверяйте пользователю, чтобы все было правильно. Это становится еще более сложным, поскольку вы идете между культурами.

Ответ 3

Надеюсь, что это поможет:)... Но обратите внимание, что процесс, скорее всего, будет медленным, если у вас много, много строк, чтобы изменить регистр...

    string str = "to title case";
    Char[] ca = str.ToCharArray();

    foreach(Match m in Regex.Matches(str, @"\b[a-z]"))
    {
        ca[m.Index] = Char.ToUpper(ca[m.Index]);
    }
    Console.WriteLine(new string(ca));

Обновление:. Или вы также можете использовать пользовательский оценщик для изменения такого типа:

    string str = "to title case";
    Console.WriteLine(Regex.Replace(str, @"\b[a-z]", delegate (Match m) 
                                                  {
                                                      return m.Value.ToUpper();
                                                  }
                      ));

Примечание, что в моем тесте с 1 000 000 итераций первый метод был только на 0,48 секунды быстрее, чем тот, который был у оценщика (первый из них занял 6,88 секунды, а последний - 7,36 секунды, чтобы завершить 1000 000 итераций) поэтому я бы не стал принимать во внимание, чтобы выбрать...

Ответ 4

Нет, нет. Если вы знаете, что строка, которую вы обрабатываете, - это имя (или, лучше сказать, последовательность человеческих имен, разделенных пробелами), вы должны иметь возможность самостоятельно ее кодировать в течение одного цикла for и используя Char.ToUpper. Тем не менее, существуют такие специфические для культуры случаи, как арабские слова "bin", "al" и т.д., Используемые в именах, которые не должны быть капитализированы (используется латинская транскрипция). То же самое относится к "фон" или "ван" на западных языках.

Обновление: Обратите внимание, что TextInfo.ToTitleCase выполняет другую цель - он не предназначен для того, чтобы загладить первые буквы человеческих имен, но чтобы обеспечить надлежащую оболочку заголовков (например, заголовки новостных статей).

Хотя текущая реализация в .NET может легко служить запрошенной цели, я бы этого не сделал. Причина в том, что реализация может значительно измениться в будущем, и, следовательно, более безопасно сделать индивидуальную реализацию для человеческих имен. Более того, я сомневаюсь, что этот метод действительно применим для титульных строк строк по отношению к данной культуре. Например, на чешском языке ("cs-CZ") правильный заголовок должен использовать только первую букву первого слова.

Ответ 5

Небольшое расширение ответа, предложенного Педро:

Regex.Replace(Name, @"(?:(M|m)(c)|(\b))([a-z])", delegate(Match m) { 
    return String.Concat(m.Groups[1].Value.ToUpper(), m.Groups[2].Value, m.Groups[3].Value, m.Groups[4].Value.ToUpper());
 });

Это будет правильно использовать McNames в дополнение к заглавной. например    "simon mcguinnis" → "Simon McGuinnis"

  • Первая группа, не связанная с захватом, будет соответствовать любому символу прерывания слова OR "Mc" / "mc".
  • Если он соответствует слову, то группы 1 и 2 пусты, а группа 3 содержит этот символ.
  • Если он соответствует "Mc" или "mc", группы 1 и 2 содержат "m" и "c", а группа 3 пуста.

    • Группа 1 ( "m" или "M" ) капитализируется.
    • Группа 2 ( "c" ) остается неизменной.
    • Группа 3 (символ разрыва) остается неизменной.
    • Группа 4 (первая буква следующего слова) капитализируется.

Все 4 группы, пустые или другие, объединяются для создания возвращаемой строки.

Ответ 6

Это работает для меня с фамилиями, в которых есть символ.

        if (Surname.Contains("'"))
        {
           String[] Names = Surname.Split('\'').ToArray();
           Surname = textInfo.ToTitleCase(Names[0].ToString());
           Surname += "''";
           Surname += textInfo.ToTitleCase(Names[1].ToString());
        }

Ответ 7

Это метод расширения класса string, который использует одно слово. Вы можете использовать его вместе с str.Split() и str.Join, чтобы использовать каждое слово строки str. Вы можете добавить проверки для строк с пустым или одним символом.

public static string Capitalize(this string word)
{
    return word.Substring(0, 1).ToUpper() + word.Substring(1).ToLower();
}

Ответ 8

в поле зрения

string titulo = "";

string result = System.Globalization.CultureInfo.TextInfo.ToLower(titulo);

, тогда примените свойство css

text-transform = font-family: sans-serif;