我正在寻找一种在 Ruby 中解析序数(第一、第二、第三等)并将它们转换为整数的方法。你知道有什么图书馆可以做到这一点吗?
问问题
500 次
4 回答
4
当我意识到chronic
gem 将其作为解析日期过程的一部分时,我问了这个问题的一半。安装 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
旨在解析日期和时间,而“秒”在该上下文中可以是序数或时间单位。要解决此问题,您可以使用以下行猴子 patchchronic
的Numerizer
类:
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 回答