2011-03-21 10 views
12

Esta es una pregunta realmente nueva para novatos.obtener cada número individual de un número entero de Fixnum Ruby on Rails

Tengo una edad almacenada en una base de datos.

Cuando obtengo la edad de la base de datos, quiero obtener cada dígito individual.

Ejemplo:

User.age = 25 

quiero conseguir lo siguiente:

first = 5 
second = 2 

Me parece que no puede luchar esta partir de los datos como su una solución num.

Cualquiera conoce una solución limpia y simple.

Respuesta

19

Puede convertir a una cadena y luego dividirla en dígitos, p.

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

Si necesita los dígitos individuales de nuevo como Fixnums, puede volver a asignarlos, p.

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

Alternativamente, puede utilizar la división entera, p.

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

Tenga en cuenta que los ejemplos anteriores están utilizando parallel assignment que no podría haber llegado a través sin embargo, si usted es nuevo en Ruby.

+4

'mapa {| dígitos | digit.to_i} 'shortcut =>' map (&: to_i) ' – fl00r

+2

También:' n.to_s.chars.map (&: to_i) '. – tokland

3

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

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

este material es muy fácil de encontrar a través de documentos de Ruby.

+0

Estaba convirtiendo a una cadena y luego usé la cadena [0] .chr. Pensé que debe haber una mejor manera. Ese divmod (10) es bastante bueno y compacto. – chell

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

genial. nunca escuché sobre 'divmod' :) – fl00r

+1

esto no devuelve el primer dígito si la edad del usuario tiene tres dígitos – Zippie

1

No es la mejor solución, pero sólo para la recolección:

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

Salida puntos de referencia para una gran cantidad de soluciones aquí: http://gistflow.com/posts/873-integer-to-array-of-digits-with-ruby El mejor es utilizar divmod en un bucle:

def digits(base) 
    digits = [] 

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

    digits.reverse 
end 
+0

Bueno, pero como método de propósito general, esto tiene un defecto: Devolverá' [] 'para' 0' . Esto se puede solucionar reemplazando 'while base! = 0' con' loop', y agregando 'return digits.reverse if base == 0' al final de ese ciclo, en lugar del valor de retorno fuera del ciclo. Sin embargo, seguirá girando infinitamente para números negativos. – daniero

2

Ruby 2.4 tiene Integer#digits método. por ejemplo:

25.digits 
# => [5, 2] 

Por lo que puede hacer

first, second = user.age.digits 
Cuestiones relacionadas