Class: SleepingKingStudios::Tools::IntegerTools

Inherits:
Base
  • Object
show all
Defined in:
lib/sleeping_king_studios/tools/integer_tools.rb

Overview

Tools for working with integers.

Constant Summary collapse

ROMANIZE_MIN =

Minimum integer value that can be converted to a roman numeral.

1
ROMANIZE_MAX =

Maximum integer value that can be converted to a roman numeral.

4999

Instance Method Summary collapse

Methods inherited from Base

instance

Instance Method Details

#count_digits(integer, base: 10) ⇒ Integer

Returns the number of digits in the given integer when represented in the specified base. Ignores minus sign for negative numbers.

Examples:

With a positive number.

IntegerTools.count_digits(31)
#=> 2

With a negative number.

IntegerTools.count_digits(-141)
#=> 3

With a binary number.

IntegerTools.count_digits(189, :base => 2)
#=> 8

With a hexadecimal number.

IntegerTools.count_digits(16724838, :base => 16)
#=> 6

Parameters:

  • integer (Integer)

    The integer to analyze.

  • base (Integer) (defaults to: 10)

    The numeric base to represent the integer in. Defaults to 10.

Returns:

  • (Integer)

    The number of digits.



85
86
87
# File 'lib/sleeping_king_studios/tools/integer_tools.rb', line 85

def count_digits(integer, base: 10)
  digits(integer.abs, base: base).count
end

#digits(integer, base: 10) ⇒ Array<String>

Decomposes the given integer into its digits when represented in the given base.

Examples:

With a number in base 10.

IntegerTools.digits(15926)
#=> ['1', '5', '9', '2', '6']

With a binary number.

IntegerTools.digits(189, :base => 2)
#=> ['1', '0', '1', '1', '1', '1', '0', '1']

With a hexadecimal number.

IntegerTools.digits(16724838)
#=> ['f', 'f', '3', '3', '6', '6']

Parameters:

  • integer (Integer)

    The integer to decompose.

  • base (Integer) (defaults to: 10)

    The numeric base to represent the integer in. Defaults to 10.

Returns:

  • (Array<String>)

    The digits of the decomposed integer, represented as a bigendian array of strings.



110
111
112
# File 'lib/sleeping_king_studios/tools/integer_tools.rb', line 110

def digits(integer, base: 10)
  integer.to_s(base).chars
end

#integer?(int) ⇒ Boolean

Returns true if the object is an Integer.

Parameters:

  • int (Object)

    The object to test.

Returns:

  • (Boolean)

    True if the object is an Integer, otherwise false.



119
120
121
# File 'lib/sleeping_king_studios/tools/integer_tools.rb', line 119

def integer?(int)
  int.is_a?(Integer)
end

#pluralize(count, single, plural = nil) ⇒ String

Returns the singular or the plural value, depending on the provided item count.

Examples:

"There are four #{StringTools.pluralize 4, 'light', 'lights'}!"
#=> 'There are four lights!'

Parameters:

  • count (Integer)

    The number of items.

  • single (String)

    The singular form of the word or phrase.

  • plural (String) (defaults to: nil)

    The plural form of the word or phrase.

Returns:

  • (String)

    The single form if count == 1; otherwise the plural form.



136
137
138
139
140
# File 'lib/sleeping_king_studios/tools/integer_tools.rb', line 136

def pluralize(count, single, plural = nil)
  plural ||= StringTools.pluralize(single)

  count == 1 ? single : plural
end

#romanize(integer, additive: false) ⇒ String

Represents an integer between 1 and 4999 (inclusive) as a Roman numeral.

Examples:

IntegerTools.romanize(4) #=> 'IV'
IntegerTools.romanize(18) #=> 'XVIII'
IntegerTools.romanize(499) #=> 'CDXCIX'

Parameters:

  • integer (Integer)

    The integer to convert.

  • additive (Boolean) (defaults to: false)

    If true, then uses only additive Roman numerals (e.g. four will be converted to IIII instead of IV, and nine will be converted to VIIII instead of IX). Defaults to false.

Returns:

  • (String)

    The representation of the integer as a Roman numeral.

Raises:

  • (RangeError)

    If the integer is less than 1 or greater than 4999.



161
162
163
164
165
166
167
168
169
170
171
172
# File 'lib/sleeping_king_studios/tools/integer_tools.rb', line 161

def romanize(integer, additive: false)
  check_romanize_range(integer)

  digits(integer)
    .reverse
    .map
    .with_index do |digit, index|
      romanize_digit(additive: additive, digit: digit.to_i, tens: index)
    end
    .reverse
    .join
end