5

我正在寻找一种在 Ruby 中解析序数(第一、第二、第三等)并将它们转换为整数的方法。你知道有什么图书馆可以做到这一点吗?

4

4 回答 4

4

当我意识到chronicgem 将其作为解析日期过程的一部分时,我问了这个问题的一半。安装 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旨在解析日期和时间,而“秒”在该上下文中可以是序数或时间单位。要解决此问题,您可以使用以下行猴子 patchchronicNumerizer类:

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

现在它起作用了:

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

但是,如果您实际上是chronic出于预期目的使用它,您可能不想搞砸它的内部结构。在这种情况下,您可以将源代码复制到Chronic::Numerizer一个新类中并改用该类。不要忘记添加['second', '2']ORDINALS新类中的常量。

于 2012-11-02T19:55:13.900 回答
1

如果 Chronic 不适合您的用例,那么有一个名为numerouno的 gem似乎专门针对此。

于 2012-11-02T20:49:18.477 回答
0

要正确解析序数“第二个”:您现在必须使用此行修改 Numerizer 类

SINGLE_ORDINALS.insert(1, ['second', 2])
于 2014-06-04T12:52:14.393 回答
0

我一直在使用一个名为 deordinalize ( https://rubygems.org/gems/deordinalize ) 的 gem,它似乎可以很好地解决问题 - 只需确保在调用之前小写即可;

>> require 'deordinalize'
>> 'Forty-Second'.downcase.deordinalize
=> 42
于 2013-02-19T18:06:13.590 回答