rails split string with custom length

时间:2013-05-11 09:15:07

标签: ruby-on-rails ruby string

我正在使用Rails和MongoMapper作为我的工作平台。

我想在月份和年份的帮助下生成自定义键。可能的格式为YYYYMM####

  • YYYY是当前年份,我可以Date.today.strftime("%Y")
  • 获取
  • MM是当前月份,我可以Date.tody.strftime("%m")获取
    • 之后###增加整数值

我用代码

获得了最后一份工作
jobForLastnum = Job.last(:order => :_id.desc)
lastJobNum = jobForLastnum.job_number

现在我的问题是我收到的job_number为'201305100'

我想将其拆分为自定义长度,例如['2013','05','100']

我知道如何在ruby中拆分字符串并且我成功地做了但是我得到了像

那样的单个字符的结果
['2','0','1','3','0','5','1','0','0']

借助于此,我可以找回年份:

lastJobNum.to_s[0,4]

借助于此,我得到了月份:

lastJobNum.to_s[4,2]

但之后有自定义长度字符串。如何在一个阵列中获取所有数据?

2 个答案:

答案 0 :(得分:3)

您可以简单地使用范围:

c = "2013121003"
[c[0..3], c[4..5], c[6..-1]]

您还可以使用String#unpack

"20131210034".unpack("A4A2A*")

或者使用String#scan

按照tessi的建议使用regexp
c = "2013121003"
c.scan(/(\d{4})(\d{2})(\d+)/)

在所有情况下,这将返回一个数组,其中年,月和作业ID为字符串。

答案 1 :(得分:1)

正则表达式可以帮到你。

jobNumber = 201305100
year, month, job_id = jobNumber.to_s.match(/(\d{4})(\d{2})(\d*)/)[1..3]

首先,我们将jobNumber转换为String。然后我们抛出一个正则表达式。 regexp有三个捕获组((\d{4})一年有四个数字,(\d{2})一个月有两个数字,(\d*) job_id的剩余数字。

job_number.to_s.match(...)会返回MatchData个对象,我们可以通过其前三个捕获组[1..3]see the documentation)访问该对象。

最后,我们将结果数组分配给变量yearmonthjob_id

year
#=> 2013
month
#=> 05
job_id
 #=> 100