2010-11-26 10 views
0

나는이긴 숫자를 그룹으로 표시하려면 어떻게합니까?

string = '1234432198766789' 

나는 그것을 같이 할 문자열 :

"1234 4321 9876 6789" 

을 할 수있는 가장 좋은 방법은 무엇입니까? Rails의 String 확장을 사용할 수 있습니다.

원래 문자열을 수정하고 싶지 않으므로 insert 메서드를 사용할 수 없습니다.

+0

훨씬 더 많은 정보가 필요합니다 : 문자열은 항상 같은 길이입니까? 아니면, 그들은 항상 네 글자로 된 경계입니까? 아니면 임의의 길이가 될 수 있으며 가능한 한 많은 4 문자 덩어리로 나누고 싶습니까? 마지막 문자열이 원하는 경우 문자열의 시작 부분이나 끝 부분에서 어디에서 오버플로 문자를 이동해야합니까? –

답변

4
p '12345678'.reverse.scan(/.{1,4}/).join(' ').reverse 
# => "1234 5678" 

reverse 이중 왜? 당신이 당신의 캐릭터는 항상 4의 배수가 될 것입니다 알고있는 경우

p '123456'.reverse.scan(/.{1,4}/).join(' ').reverse 
# => "12 3456" 

, 또는 당신이 아닌 경우 : 문자열의 길이가 4의 배수가 아닌 경우 있도록 홀수 크기의 그룹은 왼쪽에있을 것입니다 홀수 크기의 그룹이 오른쪽에 있다는 것을 염두에두고 두 전화기를 reverse으로 두십시오.

p '123456'.scan(/.{1,4}/).join(' ') 
# => "1234 56" 
+0

이것은 OP에 내가 필요성에 대한 명확한 설명을 할 것을 요구했을 때 내가 향하고 있었던 바로 그 곳이었습니다. 어떤 시점에서 예기치 않게 가변적 인 필드 너비와 비슷한 문제로 인해 물린 것이 틀림 없습니다. :-) –

+0

@ 그렉, 내가 기억하지는 않지만, 네 말이 맞을거야. 나는 어딘가에서 double-reverse 관용구를 배웠음에 틀림 없다. :) –

4

긴 버전 :

string.split("").in_groups_of(4).map { |s| s.join("") }.join(" ") 

이 어떤 종류의 전화 번호로되어 있습니까? 레일스는 number_to_phone helper that you could use입니다.

+0

'in_groups_of()'문서화 된 부분은 어디입니까? 나는 Array에서 그것을 보지 못했다. –

+4

순수 루비 방법은'each_slice (4)'를 사용하는 것입니다. 'in_groups_of' 메쏘드는 ActiveSupport의 일부입니다 : http://rails.rubyonrails.org/classes/ActiveSupport/CoreExtensions/Array/Grouping.html –

+0

그렉 : 그것은 Array 클래스에 대한 Rails (Active Support) 확장입니다. 어떤 이유로 든 api.rubyonrails.org에 나타나지 않습니다 –

1

또 다른 해결책 :

string.scan(/.{1,4}/).join(' ') 

P.S. Ryan의 솔루션은 string.split('')string.chars.to_a으로 바꿀 수있는 이점이 있습니다. 그것은 악몽 일 수 있습니다 ...

관련 문제