🐘

桁数が多い数値を書くとき、大抵の言語で桁区切り文字が使える

2022/06/02に公開

数値リテラルの区切り文字

桁数が多い数値をコーディングするとき、多くのプログラミング言語では可読性を上げるために数値リテラルに区切り文字を書くことができます。

例えばアンダースコア _ を区切り文字として使える言語であれば、 100000000100_000_000 と書くことができます。数字の間の区切り文字 _ は処理上は無視されます。

例えばPythonではこのような書き方ができます。

sample.py
i = 100_000_000              # i = 100000000 と同じ
binary_digits = 0b_1110_0101 # binary_digits = 0b11100101 と同じ

恥ずかしながら、数値リテラルで区切り文字が多くの言語で使えることを知らなかったので、主要なプログラミング言語で使える区切り文字をまとめてみました。

プログラミング言語ごとの仕様

言語 区切り文字 対応バージョン ドキュメント
C++ ' (シングルクォーテーション) 14以降 数値リテラルの桁区切り文字 - cpprefjp C++日本語リファレンス
C# _ (アンダースコア) 7以降 Digit separators - C# 7.0 specification proposals Microsoft Docs
Go _ (アンダースコア) 1.13以降 Go 1.13 Release Notes - The Go Programming Language
Java _ (アンダースコア) SE 7以降 数値リテラル内のアンダースコア
PHP _ (アンダースコア) 7.4.0以降 PHP: 整数 - Manual
Python _ (アンダースコア) 3.6以降 2. 字句解析 — Python 3.10.4 ドキュメント
Ruby _ (アンダースコア) ? (最初から?) リテラル (Ruby 3.1 リファレンスマニュアル)
VB.NET _ (アンダースコア) 15以降 型文字 - Visual Basic Microsoft Docs

挙げた言語の中では、C++のみシングルクォーテーション '、それ以外の言語ではアンダースコア _ を区切り文字として使えます。

C++では例えば次のように書くことができます。

sample.cpp
int i = 100'000'000;                // int i = 100000000; と同じ
int binary_digits = 0b1000'1111;    // int binary_digits = 0b10001111; と同じ

数値リテラルの先頭や末尾には区切り文字を書けない仕様の言語が多いです。ただし各言語によって仕様はやや異なります。連続で区切り文字を書けるか、浮動小数点型や2進数表現にも使えるか、などが異なりますので、詳しくは各言語のドキュメントをご参照ください。

どのように使うか

12341_23_4 と書くなど、小さい数値にもむやみやたらに使うと可読性が落ちるように思われます。日常生活と同様に、通常の整数はある程度大きい数値なら3桁区切り、2進数は4桁区切りで区切り文字を利用すると良さそうです。

例えばRubyの静的解析ツールであるRuboCopでは、5桁以上の数値に対して3桁ごとにアンダースコアを挟むことが推奨されています。(Style/NumericLiterals のパラメータ MinDigits のデフォルトが5のため。この桁数は調整可能です。)
https://www.rubydoc.info/gems/rubocop/RuboCop/Cop/Style/NumericLiterals

Discussion