Rubyで数値を 123_456_789 のように表示する
twitter.comirbで3桁区切りで _ を入れて数値を表示するようにしてみた pic.twitter.com/CrPxSIiaqE
— Pocke(ぽっけ) (@p_ck_) 2021年4月9日
デバッグなどをしていて、数値が区切り無しで出力されると読みづらいため、_
をはさんでみた。
Rubyでは数値リテラルで桁区切りに_
を使えるので、これも構文上はvalid。
コード
IRBで使いたかったので、~/.irbrc
に次のコードを書いた。IRB関係なく使いたい場合、class Integer ... end
の中だけを使えば良い。
# .irbrc IRB.conf[:INSPECT_MODE] = :pp class Integer def pretty_print(q) q.text to_s.gsub(/(\d+?)(?=(?:\d{3})+$)/, '\1_') end end
まず、IRBで戻り値を表示するのにpp
を使うようにする。
そしてInteger#pretty_print
を上書きして、3桁ごとに_
を挿入するようにする。
コードのライセンスはCC-0とするのでご自由にお使いください。
Known Issues
2つある。1つはIntegerにしか対応していないこと、もう1つはlocaleの扱い。
Integer以外
このコードでは当然Integerにしか対応していない。そのため、Floatでは_
で数値が区切られない。
これはまあ実装すればよいはず。
localeの扱い
現状はlocaleに関係なく、「3桁ごと」「_
で」区切るようにしている。
しかしすべての文化で3桁ごとに数値が区切られるわけではなく、例えば身近なところだと日本という国では4桁ごとに数値の区切りが表現される(とはいえ、プログラムの表示上だと実は3桁区切りのほうが分かりやすい気もする。) また、インドでの数値の区切り方は独特であり有名らしい。
つまり日本においては123_456_789
ではなく、1_2345_6789
と表示されたほうが嬉しいかもしれない。
これらの情報は、POSIXで定義されているLC_NUMERIC
という情報を使うと良いらしい。man 5 LOCALE
を読むと色々書いてある。LC_NUMERIC
を読むライブラリがRubyで用意されているのかは知らない。Pythonにはありそう(とささださんに教えてもらった)。
区切り文字も,
が使われる文化や.
が使われる文化が混在している。とはいえこれはRubyのsyntaxとしてvalidという意味で、_
で良いのでは、と思っている。
Syntaxエラーを許容するなら、日本では1億2345万6789
と表示するようにしたい。完全に読みやすい。
これらに対応したら、標準のpp
も_
区切りで数値を表示するようにしても良いのでは…とうっすら思っている。
とはいえあんまりやる気はない。やりたい方がいたらどうぞ。