루비에서 선행 0을 어떻게 출력 할 수 있습니까?


238

Ruby 스크립트에서 일련 번호가 지정된 파일을 출력하고 있습니다. 숫자는 카운터를 증가시키는 데 나옵니다. 그러나 디렉토리에서 멋지게 정렬하려면 파일 이름에 선행 0을 사용하고 싶습니다. 다시 말해

file_001 ...

대신에

file_1

숫자를 문자열로 변환 할 때 선행 0을 추가 하는 간단한 방법이 있습니까? ( "10보다 작 으면 ... 100보다 작 으면"할 수 있음).

답변:


281

카운터의 최대 자릿수가 알려진 경우 (예 : 카운터 1..876의 경우 n = 3), 할 수 있습니다

str = "file_" + i.to_s.rjust(n, "0")

8
Heh heh, 최고의 답변은 아니지만, 나는 rjust에 대해 몰랐고 몇 년 동안 루비를 사용해 왔습니다. 건배!
pauliephonic

% 03s가 이상한 이유로 공백으로 채워져있는 것 같습니다 (% 03d가 제대로 작동하는 것 같습니다). 두 경우 모두 0으로 채워진 C를 맹세 할 수있었습니다.
Nerdmaster

마지막으로 가장 간단하고 기억하기 쉽기 때문에 이것을 정답으로 바 꾸었습니다. %작동하지만 더 일반적인 목적입니다.
Nathan Long

예상치 못한 가장 쉬운
akostadinov

1
기본 36 번호를 채우는 방법은 여기에 있습니다. %는 그렇지 않은 것처럼 보입니다. 감사!
Ethan Kaminski

344

%문자열과 함께 연산자를 사용하십시오 .

irb(main):001:0> "%03d" % 5
=> "005"

왼쪽은 printf 형식 문자열이며 오른쪽은 값 목록 일 수 있으므로 다음과 같은 작업을 수행 할 수 있습니다.

irb(main):002:0> filename = "%s/%s.%04d.txt" % ["dirname", "filename", 23]
=> "dirname/filename.0023.txt"

다음 은 형식 문자열을 구성하는 데 유용한 printf 형식 치트 시트 입니다. printf 형식은 원래 C함수 printf에서 왔지만 비슷한 형식 지정 함수는 perl, ruby, python, java, php 등에서 사용할 수 있습니다.


1
큰! "% s"는 "여기에 N 번째 값을 대입합니다"를 의미하고 "% 03d"는 "여기에 숫자를 대입하여 3 자리 숫자로 만드는 데 필요한만큼 많은 숫자를 추가합니까?"를 의미합니다. (d는 "숫자"를 의미 한다고 생각합니다. ) 이 문서 ( ruby-doc.org/core/classes/String.html#M000770 )를 볼 수 있지만 매우 간결하고 약간의 정교하고 싶습니다. .
Nathan Long

1
printf 형식 치트 시트에 대한 링크를 추가했습니다. "s"는 "문자열"을 의미하고 "d"는 "십진수"를 의미합니다. "03"은 "0으로 3 ~ 3 자 패드"를 의미합니다. "% 3d"는 왼쪽에 공백으로 채워집니다.
Daniel Martin

2
BTW-Kernel#sprintf 이것은 다음과 같이 문서화되는 것과 같습니다. ruby-doc.org/core-1.9.3/Kernel.html#method-i-sprintf
Nathan Long

@NathanLong의 의견에 덧붙여이 답변의 첫 번째 예제는로 작성됩니다 sprintf("%03d", 5).
Dennis

선택한 답변이어야합니다.
Dan Barron

50

파일 이름을 연결하기 전에 값의 문자열 형식 을 사용할 수 있습니까 ?

"%03d" % number

이 답변은 @Daniel Martin의 답변에 아무것도 추가하지 않는다고 생각하지만, 그 단순함을 좋아합니다 ...
svelandiag

3
그는 Daniel Martin과 같은 순간에 대답 했으므로 복제를 알지 못했을 것입니다.
Kurt Peek

이것은 utc_offset에 적합합니다
Abel

30

String#next카운터로 사용하십시오 .

>> n = "000"
>> 3.times { puts "file_#{n.next!}" }
file_001
file_002
file_003

next 상대적으로 '영리하다'는 의미는

>> n = "file_000"
>> 3.times { puts n.next! }
file_001
file_002
file_003

이것을 지적 해 주셔서 감사합니다. 이것은 멋진 방법입니다.
Weston Ganger

9

다른 답변에서 언급했듯이 "%03d" % number꽤 잘 작동하지만 rubocop 루비 스타일 가이드에 위배됩니다 .

상당히 비밀스러운 String # % 방법에 비해 sprintf 및 별명 형식을 사용하는 것이 좋습니다

다음을 사용하여 더 읽기 쉬운 방식으로 동일한 결과를 얻을 수 있습니다.

format('%03d', number)

1
모호한 Ruby 언어 기능을 배우는 것이 목표 인 경우 별명을 사용하십시오 format. 코드를 이해하기 쉽게 만드는 것이 목표라면 sprintf표준 C 라이브러리의 일부이므로 를 사용해야합니다 . 이 이름은 프로그래밍 언어에서 사용됩니다. 더 많은 사람들이 그것이 무엇인지 이해하는 sprintf것은 format그것이 그것의 별명이라는 것을 아는 숫자에 비해 . 무언가가 RuboCop의 일부이기 때문에 본질적으로 옳고 그른 것이 아닙니다. 프로젝트에 가장 적합한 규칙을 선택하십시오. '%03d' % number더 읽기 쉽습니다.
Tilo

1
이 동일한 루프를 거쳐로 변경 한 다음 RuboCop의 제안 에 따라 변경 "%02d" % num했습니다 . 그런 다음 보다 더 일반적인 것으로 결정 했기 때문에 rubocop.yml을 업데이트 하여 밤에 잘 자고 있습니다. sprintf(...)format(...)sprintfformatStyle/FormatString: EnforcedStyle: sprintf
David Hempy

1

filenames = '000'.upto('100').map { |index| "file_#{index}" }

출력

[file_000, file_001, file_002, file_003, ..., file_098, file_099, file_100]

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.