Edited at

プレースホルダーを使って文字列に値を埋め込む

More than 5 years have passed since last update.


やりたいこと

I18n ではプレースホルダーを使った値の埋め込みができます。

ja:

hidamari:
explanation: '%{number}号室には%{name}さんが住んでいます。'

I18n.t('hidamari.explanation.', { number: 201, name: 'ゆの' })

#=> "201号室にはゆのさんが住んでいます。"

これを I18n 無しでも同じようなことができないかなと思いました。


結論

String#% もしくは Kernel.#format (Kernel.#sprintf) を利用すれば I18n.t と同じような使い方が可能です。


※ String#% は Kernel.#format の糖衣構文です。

'%{number}号室には%{name}さんが住んでいます。' % { number: 201, name: 'ゆの' }

#=> "201号室にはゆのさんが住んでいます。"

'SELECT * FROM girls WHERE age < %{age} AND name LIKE \'%%%{name}%%\'' % { age: 18, name: '杏子' }
#=> "SELECT * FROM girls WHERE age < 18 AND name LIKE '%杏子%'"

ちなみに上記の例のように % をエスケープしたい場合は、文字列中で %% と書けば OK です。