class Skr::Core::Numbers::PercNum
### PercNum
A “percnum” is a Stockor
invention *(or abomination, depending on your POV)*. It's a string that contains a number and an optional percent sign. If the percent sign is present, the number is treated as a percentage. If desired the user may also input negative numbers which will invert the sense of the method.
It's intended to be a user-friendly method to provide one input box for “discount” or “surcharge”, and allow the user to input either a flat amount such as 4.50, or a percentage like 20%
Public Class Methods
@param perc_or_num [BigDecimal,String, Integer] any value that BigDecimal will accept
# File lib/skr/core/numbers.rb, line 31 def initialize( perc_or_num ) @is_perc = !! perc_or_num.to_s.match( /\%\s*$/ ) @right_side = BigDecimal.new( perc_or_num, 5 ) if is_percentage? @right_side *= 0.01 end end
Public Instance Methods
Adds the PercNum
to the specified amount. @param amount the amount that should be added to the PercNum
@return [BigDecimal] The result of either adding (non percent) or multiplying by (percent) the amount @example
PercNum.new( '23.42' ).credit_to( 33 ).to_s #=> '56.42' PercNum.new( '25%' ).credit_to( 100 ).to_s #=> '125.0'
# File lib/skr/core/numbers.rb, line 45 def credit_to( amount ) is_percentage? ? ( 1 + @right_side ) * amount : amount += @right_side end
Subtracts the PercNum
to the specified amount. @param amount the amount that should be added to the PercNum
@return [BigDecimal] The result of either adding (non percent) or multiplying by (percent) the amount @example
PercNum.new( '23.42' ).debit_from( 42.42 ).to_s #=> '19.00' PercNum.new( '25%' ).debit_from( 100 ).to_s #=> '75.0'
# File lib/skr/core/numbers.rb, line 55 def debit_from( amount ) is_percentage? ? ( 1 - @right_side ) * amount : amount -= @right_side end
Is the PercNum
percentage based or absolute
# File lib/skr/core/numbers.rb, line 65 def is_percentage? @is_perc end
If PercNum
was initialized with a blank string
# File lib/skr/core/numbers.rb, line 60 def present? ! @right_side.zero? end