2010-06-16 67 views
6

我试图采取以下号码:如何在Ruby中的每四个整数之间创建空格?

423523420987 

并将其转换为这样的:

4235 2342 0987 

它不一定是一个整数要么。事实上,我宁愿它是一个字符串。

+3

你的号码是否保证平均分成4组?如果不是,你是否想要<4组在开始(12 3456 7890)或结束(1234 5678 90)? – 2010-06-16 13:37:33

回答

13

可以使用String::gsub用正则表达式:

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

这可能是最快的,Garrett的更容易阅读,只是因为所需的正则表达式更简单。 – 2010-06-16 13:15:31

0

循环遍历每个数字,如果循环索引mod 4 = 0,则放置一个空格。

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

如果你万一找填零,你有小于12或大于12个的数字,这将有助于你出:

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'可能是最快的,在我看来这是最漂亮的。 – 2010-06-16 13:13:54

+0

在编辑之后,关于“填充零”的位不再适用。 – 2010-06-16 21:53:50

2

要扩大@Mark Byer的a nswer和@glenn mcdonald的评论,如果你的字符串/数字的长度不是4的倍数,你想要做什么?

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

'1234567890'.reverse.gsub(/.{4}(?=.)/, '\0 ').reverse 
# => "12 3456 7890" 
相关问题