.ToTitleCase не работает во всех строках верхнего регистра

Public Function TitleCase(ByVal strIn As String)
      Dim result As String = ""
      Dim culture As New CultureInfo("en", False)
      Dim tInfo As TextInfo = culture.TextInfo()
      result = tInfo.ToTitleCase(strIn)
      Return result
 End Function

Если я введу "ТЕСТ" в функцию выше. Выход - "TEST". В идеале он выводит "Тест"

Я также пробовал фрагменты кода из этого сообщения безрезультатно: Использование ToTitleCase

Ответы

Ответ 1

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

Из MSDN:

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

Использование обходного пути (в С#):

string yourString = "TEST";

TextInfo formatter = new CultureInfo("en-US", false).TextInfo;    
formatter.ToTitleCase(yourString.ToLower());

Ответ 2

Также String.ToTitleCase() будет работать для большинства строк, но имеет проблемы с именами, такими как McDonald и O'Brian, и я использую CurrentCulture для вариаций в капитализации. Это простой метод расширения, который будет обрабатывать эти функции:

public string ToProperCase(this string value)
{

    if (string.IsNullOrEmpty(value)) {
        return "";
    }

    string proper = System.Threading.Thread.CurrentThread.CurrentCulture.
                    TextInfo.ToTitleCase(value.ToLower());

    int oddCapIndex = proper.IndexOfAny({
        "D'",
        "O'",
        "Mc"
    });


    if (oddCapIndex > 0) {
        // recurse
        proper = proper.Substring(0, oddCapIndex + 2) +
                 proper.Substring(oddCapIndex + 2).ToProperCase();

    }

    return proper;

}

Также расширение IndexOfAny (String []):

public int IndexOfAny(this string test, string[] values)
{
    int first = -1;
    foreach (string item in values) {
        int i = test.IndexOf(item);
        if (i > 0) {
            if (first > 0) {
                if (i < first) {
                    first = i;
                }
            } else {
                first = i;
            }
        }
    }
    return first;
}

Ответ 3

Что касается ответа 1, это хорошая идея, но код не компилируется; и, если исправлено синтаксис, это не сработает. У меня не было времени отлаживать его, но вам нужно будет, если вы хотите его использовать. Часть проблемы заключается в том, что индекс предполагает индексы на основе 1, но они основаны на 0 на С#. Существуют и другие проблемы.