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も_区切りで数値を表示するようにしても良いのでは…とうっすら思っている。
とはいえあんまりやる気はない。やりたい方がいたらどうぞ。