2012-11-02 33 views

回答

4

當我意識到chronic gem將此作爲解析日期的一部分時,我通過詢問這個問題已經過半。安裝寶石後,你可以序數轉換爲整數很容易地:

irb(main):001:0> require 'chronic' 
=> true 
irb(main):002:0> Chronic::Numerizer.numerize("eighty-fifth").to_i 
=> 85 

編輯:遺憾的是,似乎chronic不能正確分析序「第二」:

irb(main):003:0> Chronic::Numerizer.numerize("twenty-second").to_i 
=> 20 

原因是chronic被設計爲解析日期和時間,而「second」可能是在這種情況下的序數或單位時間。爲了解決這個問題,你可以猴子補丁chronicNumerizer類這一行:

Chronic::Numerizer::ORDINALS.insert(1, ['second', '2']) 

現在,它的工作原理:

irb(main):005:0> Chronic::Numerizer.numerize("eighty-second").to_i 
=> 82 

如果您在實際使用chronic其預期目的,雖然,你可能將不想與其內部結合。在這種情況下,您可以將source codeChronic::Numerizer複製到一個新類中,然後使用該類。不要忘記在新班級中將['second', '2']添加到ORDINALS常數中。

+1

在回答自己的問題:) –

1

有一個叫做numerouno的寶石,如果Chronic不適合你的用例,它似乎是專門針對這個的。

+0

這似乎只處理基數大工作數字(一,二,三等),而不是序數(第一,第二,第三)。儘管如此,仍然很有用。 – Ajedi32

+0

Doh,你說得對。抱歉! –

0

我一直在使用一種名爲deordinalize(https://rubygems.org/gems/deordinalize)的寶石,它似乎很好地做了這個訣竅 - 只要確保你在調用之前敲響了它;

>> require 'deordinalize' 
>> 'Forty-Second'.downcase.deordinalize 
=> 42 
0

正確解析序「第二」: 你現在必須猴補丁Numerizer類此行

SINGLE_ORDINALS.insert(1, ['second', 2]) 
相關問題