.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 на С#. Существуют и другие проблемы.