2010-06-16 8 views
6

Estoy tratando de tomar el siguiente número:¿Cómo creo espacios entre cada cuatro enteros en Ruby?

423523420987 

y convertirlo a esto:

4235 2342 0987 

No necesariamente tiene que ser un número entero cualquiera. De hecho, preferiría que fuera una cadena.

+3

¿Se garantiza que sus números se dividan equitativamente en grupos de 4? Si no es así, ¿quiere el grupo <4 al principio (12 3456 7890) o al final (1234 5678 90)? –

Respuesta

13

Puede utilizar String::gsub con una expresión regular:

=> 'abcdefghijkl'.gsub(/.{4}(?=.)/, '\0 ') 
'abcd efgh ijkl' 
+0

Este es probablemente el más rápido, el de Garrett es más fácil de leer, solo porque la expresión regular que se requiere es más simple. –

0

Pasa a través de cada dígito y si el índice de bucle mod 4 = 0, coloca un espacio.

Modulus in Ruby

13
class String 
    def in_groups_of(n, sep=' ') 
    chars.each_slice(n).map(&:join).join(sep) 
    end 
end 

423523420987.to_s.in_groups_of(4)  # => '4235 2342 0987' 
423523420987.to_s.in_groups_of(5, '-') # => '42352-34209-87' 
2

Si están en busca de ceros acolchados en caso de tener menos de 12 o más de 12 números que esto ayudará fuera de línea:

irb(main):002:0> 423523420987.to_s.scan(/\d{4}/).join(' ') 
=> "4235 2342 0987" 
irb(main):008:0> ('%d' % 423523420987).scan(/\d{4}/).join(' ') 
=> "4235 2342 0987" 
+0

Mark Byers 'es probablemente el más rápido, este es el más bonito, en mi opinión. –

+0

El bit sobre "ceros acolchados" no se aplica después de la edición. –

2

Expandir en @Mark Byer's a nswer y @glenn mcdonald's comment, ¿qué quieres hacer si la longitud de tu cadena/número no es un múltiplo de 4?

'1234567890'.gsub(/.{4}(?=.)/, '\0 ') 
# => "1234 5678 90" 

'1234567890'.reverse.gsub(/.{4}(?=.)/, '\0 ').reverse 
# => "12 3456 7890" 
Cuestiones relacionadas