はじめに
Rubyの0埋め処理においてエラーが発生したので、原因と対応策を備忘として残しておきます。
エラーになる場合がある0埋め処理
# 月を0埋めして2桁にしようとした
# monthには「09」と言う文字列が設定されていた
val = sprintf('%d/%02d/01', year, month)
結果
invalid value for Integer(): "09" (ArgumentError)
【原因】
Rubyに限ったことではないが、整数リテラルの前に0があると8進数と認識されることがある。
(「されることがある」としているのは使用する関数や前後の処理で変わってくるため。)
今回の場合、「09」を8進数と認識され、8進数で9は存在しないよ!といった感じでエラーになった。
【対応策】
"%02d"の部分に文字列を渡さず、整数化してから渡す。
val = sprintf('%d/%02d/01', year, month.to_i)
おわりに
8進数では8も使用できない。
扱える数値は各々調べてみて下さい。