2011-03-21 46 views
12

这是一个真正的超新手问题。从Fixnum整数获取每个单独的数字Ruby on Rails

我有一个存储在数据库中的年龄。

当我从数据库中获得年龄时,我想获取每个单独的数字。

例子:

User.age = 25 

我希望得到以下几点:

first = 5 
second = 2 

我似乎无法从数据作为其修复NUM搏斗此。

任何人都知道一个干净和简单的解决方案。

回答

19

您可以转换为一个字符串,然后分割成数字,例如

first, second = User.age.to_s.split('') 
=> ["2", "5"] 

如果您需要返回个别数字作为Fixnums,您可以将它们映射回来,例如,

first, second = User.age.to_s.split('').map { |digit| digit.to_i } 
=> [2, 5] 

或者,您可以使用整数除法例如

first, second = User.age.div(10), User.age % 10 
=> [2, 5] 

注意上面的例子是使用parallel assignment,你可能不会遇到但如果你是新来的Ruby。

+4

'地图{|位| digit.to_i}'shortcut =>'map(&:to_i)' – fl00r 2011-03-21 13:42:21

+2

另外:'n.to_s.chars.map(&:to_i)'。 – tokland 2013-05-05 12:56:06

3

http://www.ruby-doc.org/core/classes/String.html#M001210

25.to_s.each_char {|c| print c, ' ' } 

这东西是很容易通过的Ruby文档找到。

+0

我正在转换为一个字符串,然后使用字符串[0] .chr。我认为一定有更好的办法。这个divmod(10)非常酷且紧凑。 – chell 2011-03-21 14:00:34

7
first, last = User.age.divmod(10) 
+0

很酷。从来没有听说过'divmod' :) – fl00r 2011-03-21 13:32:31

+1

如果用户年龄有三位数,这不会返回第一位数 – Zippie 2013-04-24 23:16:59

1

不是最好的解决办法,但只是为了收集:

User.age.chars.to_a.map(&:to_i) 
#=> [5, 2] 
first, second = User.age.chars.to_a.map(&:to_i) 
3

退房的基准进行了大量的解决方案在这里:http://gistflow.com/posts/873-integer-to-array-of-digits-with-ruby最好的一个是在一个循环中使用divmod

def digits(base) 
    digits = [] 

    while base != 0 do 
    base, last_digit = base.divmod(10) 
    digits << last_digit 
    end 

    digits.reverse 
end 
+0

不错,但作为通用的方法,这有一个缺陷:它会返回'[]'为'0' 。这可以通过用'loop'替换'while base!= 0'来解决,并且在该循环的底部添加'returns digits.reverse if base == 0',而不是循环外部的返回值。但它仍然会无限循环负数。 – daniero 2015-07-20 16:27:53

2

Ruby 2.4有Integer#digits方法。例如:

25.digits 
# => [5, 2] 

所以,你可以做

first, second = user.age.digits