Skip to content

readysteady/percentage

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

percentage

Gem Version Test Status

Ruby gem for working with percentages.

Install

Using Bundler:

$ bundle add percentage

Using RubyGems:

$ gem install percentage

Constructing Percentages

The Percentage method converts numeric objects to percentage objects with values that you would expect:

Percentage(50)  # => 50%

Percentage(BigDecimal('17.5'))  # => 17.5%

Percentage(Rational(25, 2))  # => 12.5%

Percentage objects can also be constructed directly, but in this case BigDecimal/Rational values are treated as fractions:

Percentage.new(50)  # => 50%

Percentage.new(BigDecimal('0.175'))  # => 17.5%

Percentage.new(Rational(1, 8))  # => 12.5%

Some shortcut methods are defined on Integer and BigDecimal for convenience:

50.percent  # => 50%

5.as_percentage_of(10)  # => 50.0%

BigDecimal('2.9').to_percentage  # => 2.9%

Numeric features

As with other numerics, percentage objects are conceptually immutable. Common numeric functionality like to_i, to_f, to_s, to_r, zero?, and equality/comparison methods are defined.

Percentages can be added together:

Percentage(10) + Percentage(20)  # => 30%

They can also be "scaled up" using the scale method:

Percentage(10).scale(5)  # => 50%

Multiplication is defined using the fractional value of the percentage. BigDecimal objects can't be coerced into rational objects, so the multiplication order will matter in some cases, for example:

Percentage(50) * 10  # => (5/1)

Percentage(50) * Percentage(10)  # => 5.0%

BigDecimal('150.00') * Percentage(50)  # => BigDecimal('75.00')

Percentage(50) * BigDecimal('150.00')  # raises TypeError

Bonus extras

There's a #percent_of method defined on Integer and BigDecimal for percentage calculations:

50.percent_of(BigDecimal(150))  # => BigDecimal('75.00')

10.percent_of(100)  # => (10/1)

BigDecimal('0.5').percent_of(88)  # => BigDecimal('0.44')

There's also a Percentage.change method for calculating the percentage change between two values:

Percentage.change(2, 3)  # => 50.0%