pockestrap

Programmer's memo

Rubyで数値を 123_456_789 のように表示する

twitter.com

デバッグなどをしていて、数値が区切り無しで出力されると読みづらいため、_をはさんでみた。 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_区切りで数値を表示するようにしても良いのでは…とうっすら思っている。

とはいえあんまりやる気はない。やりたい方がいたらどうぞ。