У кого-нибудь есть хороший правильный алгоритм - PullRequest
25 голосов
/ 28 августа 2008

Есть ли у кого-нибудь надежный правильный регистр или алгоритм PCase (похожий на UCase или Upper)? Я ищу что-то, что принимает значение, такое как "GEORGE BURDELL" или "george burdell" и превращает его в "George Burdell".

У меня есть простой, который обрабатывает простые случаи. Идеальным было бы иметь что-то, что может обрабатывать такие вещи, как "O'REILLY" и превратить это в "O'Reilly", но я знаю, что это сложнее.

Я в основном сосредоточен на английском языке, если это упрощает вещи.


ОБНОВЛЕНИЕ: Я использую C # в качестве языка, но могу конвертировать практически из всего (при условии, что подобная функциональность существует).

Я согласен, что Scneario McDonald's является жестким. Я хотел упомянуть это вместе с моим примером О'Рейли, но не в оригинальном посте.

Ответы [ 13 ]

0 голосов
/ 28 января 2009

Кроноз, спасибо. Я нашел в вашей функции, что строка:

`if (!lowerWord.Contains(lowerPrefix)) return word`;

должен сказать

if (!lowerWord.StartsWith(lowerPrefix)) return word;

поэтому «информация» не изменяется на «InforMacIón»

лучший

Enrique

0 голосов
/ 28 августа 2008

Вы не упоминаете, на каком языке вы хотели бы найти решение, поэтому здесь приведен псевдокод.

Loop through each character
    If the previous character was an alphabet letter
        Make the character lower case
    Otherwise
        Make the character upper case
End loop
0 голосов
/ 28 августа 2008

простой способ заглавных букв первой буквы каждого слова (разделенных пробелом)

$words = explode(” “, $string);
for ($i=0; $i<count($words); $i++) {
$s = strtolower($words[$i]);
$s = substr_replace($s, strtoupper(substr($s, 0, 1)), 0, 1);
$result .= “$s “;
}
$string = trim($result);

с точки зрения подражания приведенному вами примеру "O'REILLY" разбиение строки на оба пробела и 'не сработает, так как оно будет использовать заглавную букву, которая появляется после апострафа, то есть в фредах

так что я бы, наверное, попробовал что-то вроде

$words = explode(” “, $string);
for ($i=0; $i<count($words); $i++) {

$s = strtolower($words[$i]);

if (substr($s, 0, 2) === "o'"){
$s = substr_replace($s, strtoupper(substr($s, 0, 3)), 0, 3);
}else{
$s = substr_replace($s, strtoupper(substr($s, 0, 1)), 0, 1);
}
$result .= “$s “;
}
$string = trim($result);

Это должно поймать О'Рейли, О'Клока, О'Доннелла и т. Д. Надеюсь, это поможет

Обратите внимание, что этот код не проверен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...