Rubyで数値の0埋め

(image)Rubyで数値の0埋め
目次

Rubyで数値の0埋めするときの書き方をよく忘れるのでメモ。

TL;DR

結論としては下記のように書くとよい。

format("number: %09<number>d", number: 1) #=> "number: 000000001"

Rubyで数値の0埋め

Rubyで数値の0埋めしようと思うとこんな感じのコードになる。

sprintf("number: %09d", 1) #=> "number: 000000001"

sprintf フォーマットはC由来の関数だ。%09dの意味としては%dが数値、09は9桁の0埋めという意味になる。

また、String#%を使う方法もある。sprintfと同じ挙動をする。

"number: %09d" % 1 #=> "number: 000000001"

こちらのほうがより簡潔な表記だ。

RuboCopのオススメ書き方

上述の書き方でも問題ないのだが、rubocop(デフォルト設定)に通すと下記の通り怒られる。

Favor format over sprintf

C: Style/FormatString: Favor format over sprintf.

sprintfではなくformatを使え、と。また String#% を使った書き方も下記の指摘がくる。

Favor format over String#%

C: Style/FormatString: Favor format over String#%.

ちなみにformatsprintfのエイリアス関数。

rb_define_global_function("sprintf", f_sprintf, -1);
rb_define_global_function("format", f_sprintf, -1);

ref. ruby/object.c at 946e5cc668f66a4a0b79461047d3fcba8b71eef0 · ruby/ruby

rubocopの指摘に従って下記のように修正してみる。

format("number: %09d", 1) #=> "number: 000000001"

Prefer annotated tokens

これでもrubocopに下記のように怒られる。

C: Style/FormatStringToken: Prefer annotated tokens (like %<foo>s) over unannotated tokens (like %s).

<foo>のようなannotated tokenを使って名前を与えてやれ、とのことらしい。

結論

rubocopの指摘を乗り越えて、最終的には下記で完成です。

format("number: %09<number>d", number: 1) #=> "number: 000000001"