Rubyで先行ゼロを出力するにはどうすればよいですか?


238

Rubyスクリプトから一連の番号付きファイルを出力しています。数値はカウンターのインクリメントから取得されますが、それらをディレクトリ内で適切に並べ替えるために、ファイル名に先行ゼロを使用したいと思います。言い換えると

file_001 ...

の代わりに

file_1

数値を文字列に変換するときに先行ゼロを追加する簡単な方法はありますか?(「10未満の場合... 100未満の場合」を実行できることはわかっています)。

回答:


281

カウンタの最大桁数がわかっている場合(たとえば、カウンタ1..876の場合はn = 3)、次のようにできます。

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

8
ベストアンサーではありませんが、rjustについては知らなかったので、何年もルビーを使用しています。乾杯!
pauliephonic 2009年

なんらかの理由で%03sにスペースが埋め込まれているようです(%03dは正常に動作しているようです)。どちらの場合も、Cにゼロを埋め込んだと誓ったかもしれません。
Nerdmaster 2013年

これが最も簡単で覚えやすいので、最終的にこれを受け入れられた回答に切り替えました。%動作しますが、より一般的な目的です。
ネイサンロング

予想外だが最も簡単
akostadinov

1
基数36の数字を埋める方法についてはここに来ました。これはそのために機能しますが、%は機能しないように見えます。ありがとう!
イーサンカミンスキー2017年

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)ですが、非常に簡潔で、少し詳しく説明したいと思います。 。
ネイサンロング

1
printf形式のチートシートへのリンクを追加しました。「s」は「文字列」、「d」は「10進数」を意味します。「03」は、「3文字をゼロで埋める」を意味します。"%3d"は左側をスペースで埋めます。
ダニエルマーティン

2
ところで、これはと同じで、Kernel#sprintfここに記載されています:ruby-doc.org/core-1.9.3/Kernel.html#method-i-sprintf
Nathan Long

@NathanLongのコメントに追加すると、この回答の最初の例はと記述されsprintf("%03d", 5)ます。
デニス

これが選択された答えになるはずです。
Dan Barron、2014

50

ファイル名を連結する前に、値の文字列フォーマットを使用できませんか?

"%03d" % number

この答えは@Daniel Martinの答えに何も追加しないと思いますが、私はその単純さが好きです...
svelandiag

3
彼はダニエル・マーティンと同じ時間に答えたので、おそらく重複を知らなかったでしょう。
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 rubyスタイルガイドに反します

かなり不可解なString#%メソッドよりもsprintfおよびそのエイリアス形式の使用を優先します

以下を使用すると、より読みやすい方法で同じ結果を得ることができます。

format('%03d', number)

1
あいまいなRuby言語機能を学ぶことが目的の場合は、エイリアスを使用しformatます。コードをわかりやすくすることを目標とする場合sprintfは、標準Cライブラリの一部なので、を使用する必要があります。この名前は、プログラミング言語全体で使用されます。sprintfそれformatがそのエイリアスであることを知っている数と比較して、より多くの人々が何をするかを理解しています。何かがRuboCopの一部であるからといって、それが本質的に正しいか間違っているかはわかりません。プロジェクトに最も適したルールを選択してください。'%03d' % number読みやすいです。
は、Tilo

1
私はこの同じループを通過し、に変更"%02d" % numsprintf(...)、次にformat(...)RuboCopの提案に従って変更しました。それから、それsprintfがより慣習的formatであるStyle/FormatString: EnforcedStyle: sprintfと判断したので、rubocop.ymlをで更新しました。
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.