2009-03-06 5 views
0

Rails a une fonction intéressante, ordinalize, qui convertit un entier en une représentation de chaîne amicale. A savoir 1 devient 1er, 2 devient 2e, et ainsi de suite. Ma question est comment pourrait-on mettre en œuvre la fonctionnalité inverse?Le problème d'analyse ordinale

Pour être plus général que je voudrais traiter les deux cas suivants:

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

Je suis à la recherche d'une façon intelligente de le faire, par opposition à une table de recherche géant ou tout simplement le piratage au large de la dernière deux caractères. Toute idée serait appréciée.

Répondre

7

to_i fait essentiellement 1/2 que:

"72nd".to_i 
=> 72 

Il ne vérifie pas la validité, mais si vous avez besoin d'échouer sur une mauvaise entrée comme « 72x », vous pouvez simplement re-ordinalize et comparer à la chaîne d'entrée d'origine.

Pour analyser les mots ordinaux, Wikipedia seems impressively helpful.

0

Le premier cas est relativement difficile - je dirais que la façon intelligente de le faire est de trouver quelqu'un qui l'a déjà fait et d'utiliser son code. Si vous ne pouvez pas trouver quelqu'un, la prochaine chose la plus intelligente serait probablement de répéter (ou de renégocier) le problème afin qu'il ne soit pas nécessaire. Au-delà, je pense que vous êtes dans l'écriture parser ...

Le deuxième cas est aussi trivial que le to_i déjà offert. Vous pouvez également utiliser une regex, je suppose:

"1000000th".scan(/\d+/).first.to_i #=> 1000000