2009-03-06 5 views
0

Rails имеет приятную функцию, ordinalize, которая преобразует целое число в дружественное строковое представление. А именно 1 становится 1-м, 2 становится 2-м и так далее. Мой вопрос в том, как можно реализовать обратную функцию?Задача синтаксического анализа

Чтобы быть более общими, я хотел бы обрабатывать оба из следующих случаев:

>> s = "First" 
>> s.integerize 
=> 1 
>> s = 1st 
>> s.integerize 
=> 1 

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

ответ

7

to_i делает по существу 1/2 того, что:

"72nd".to_i 
=> 72 

Он не проверяет достоверность, но если вам нужно потерпеть неудачу на плохой вход как «72x», вы можете просто повторно ordinalize и сравните исходная строка ввода.

Для разбора порядковых слов, Wikipedia seems impressively helpful.

0

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

Второй случай такой же тривиальный, как и для уже предложенного to_i. Вы также можете использовать регулярное выражение, я полагаю:

"1000000th".scan(/\d+/).first.to_i #=> 1000000 
Смежные вопросы