- 公開日
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#%.
ちなみにformat
はsprintf
のエイリアス関数。
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"