class RuboCop::Cop::Style::NumericLiterals


10_000_00 # typical representation of $10,000 in cents
# bad
@example Strict: true
10_000_00 # typical representation of $10,000 in cents
# good
@example Strict: false (default)
1000
1_000_000
# good
1_0000
1_00_000
1000000
# bad
@example
of digits in them.
This cop checks for big numeric literals without _ between groups

def check(node)

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+$/
    return unless (self.max = int.size + 1)
    register_offense(node)
  when /\d{4}/, short_group_regex
    return unless (self.config_to_allow_offenses = { 'Enabled' => false })
    register_offense(node)
  end
end

def format_int_part(int_part)

Parameters:
  • int_part (String) --
def format_int_part(int_part)
  int_part = Integer(int_part)
  formatted_int = int_part
                  .abs
                  .to_s
                  .reverse
                  .gsub(/...(?=.)/, '\&_')
                  .reverse
  formatted_int.insert(0, '-') if int_part.negative?
  formatted_int
end

def format_number(node)

def format_number(node)
  source = node.source.gsub(/\s+/, '')
  int_part, additional_part = source.split(DELIMITER_REGEXP, 2)
  formatted_int = format_int_part(int_part)
  delimiter = source[DELIMITER_REGEXP]
  if additional_part
    formatted_int + delimiter + additional_part
  else
    formatted_int
  end
end

def max_parameter_name

def max_parameter_name
  'MinDigits'
end

def min_digits

def min_digits
  cop_config['MinDigits']
end

def on_float(node)

def on_float(node)
  check(node)
end

def on_int(node)

def on_int(node)
  check(node)
end

def register_offense(node)

def register_offense(node)
  add_offense(node) do |corrector|
    corrector.replace(node, format_number(node))
  end
end

def short_group_regex

def short_group_regex
  cop_config['Strict'] ? /_\d{1,2}(_|$)/ : /_\d{1,2}_/
end