class RubbyCop::Cop::Style::NumericLiterals

This cop checks for big numeric literals without _ between groups of digits in them.

@example

# bad

1000000
1_00_000
1_0000

# good

1_000_000
1000

# good unless Strict is set

10_000_00 # typical representation of $10,000 in cents

Constants

MSG

Public Instance Methods

on_float(node) click to toggle source
# File lib/rubbycop/cop/style/numeric_literals.rb, line 40
def on_float(node)
  check(node)
end
on_int(node) click to toggle source
# File lib/rubbycop/cop/style/numeric_literals.rb, line 36
def on_int(node)
  check(node)
end

Private Instance Methods

autocorrect(node) click to toggle source
# File lib/rubbycop/cop/style/numeric_literals.rb, line 71
def autocorrect(node)
  lambda do |corrector|
    corrector.replace(node.source_range, format_number(node))
  end
end
check(node) click to toggle source
# File lib/rubbycop/cop/style/numeric_literals.rb, line 50
def check(node)
  int = integer_part(node)

  # TODO: handle non-decimal literals as well
  return if int.start_with?('0')
  return unless int.size >= min_digits

  case int
  when /^\d+$/
    add_offense(node, :expression) { self.max = int.size + 1 }
  when /\d{4}/, short_group_regex
    add_offense(node, :expression) do
      self.config_to_allow_offenses = { 'Enabled' => false }
    end
  end
end
format_number(node) click to toggle source
# File lib/rubbycop/cop/style/numeric_literals.rb, line 77
def format_number(node)
  int_part, float_part = node.source.split('.')
  int_part = int_part.to_i
  formatted_int = int_part
                  .abs
                  .to_s
                  .reverse
                  .gsub(/...(?=.)/, '\&_')
                  .reverse
  formatted_int.insert(0, '-') if int_part < 0

  if float_part
    format('%s.%s', formatted_int, float_part)
  else
    formatted_int
  end
end
max_parameter_name() click to toggle source
# File lib/rubbycop/cop/style/numeric_literals.rb, line 46
def max_parameter_name
  'MinDigits'
end
min_digits() click to toggle source
# File lib/rubbycop/cop/style/numeric_literals.rb, line 95
def min_digits
  cop_config['MinDigits']
end
short_group_regex() click to toggle source
# File lib/rubbycop/cop/style/numeric_literals.rb, line 67
def short_group_regex
  cop_config['Strict'] ? /_\d{1,2}(_|$)/ : /_\d{1,2}_/
end