The Elements of Style in Ruby #5: Readability of long numeric literals
Today’s topic is the following rule from the Ruby Style Guide:
Add underscores to large numeric literals to improve their readability.
Most of the programs we write feature a substantial number of numeric
literals(e.g. 10
, 0.34
, 0b1010
, 0123
, 0xCAFE
). There is nothing
strange or unusual about that. From time to time, however, those literals are pretty long:
MAX_SIZE = 10000000000
DEVIATION = 0.2343434343
BIT_MASK = 0b100101010101
I’m pretty sure most of you would have pretty hard time to quickly
digest a number written in this way - lots of digits and no separators
between them to help us discern the number’s structure
. At this
point _
makes a dramatic appearance and comes to the rescue:
MAX_SIZE = 10_000_000_000
DEVIATION = 0.2_343_434_343
BIT_MASK = 0b1001_0101_0101
The addition of a few _
improves the readability of those huge literals a ton!
The underscores we add to numeric literals are ignored by Ruby
:
100_000
# => 100000
As you can see from the preceding example nothing’s lost or changed - we’ve only gained readability and eased the parsing burden on our brains.
Obviously we should not overdo _
:
# short literals are pretty readable on their own
# bad
1_00
# good
100
Personally, when dealing with decimal literals, I tend to use _
for
numbers with at 5 least digits (e.g. 11_948
). The number of digits to separate with
_
depends on the numeric base - in decimal it makes sense to group
digits by 3 (e.g. 1_000_000
), in binary by 4 (e.g. 0b1111_1010_1110
), etc.
That’s all for today folks! Hope I managed to convince at least a few of you of the benefits of using underscores in your long numeric literals.
As usual I’m looking forward to hearing your thoughts here and on Twitter!