class RuboCop::Cop::Style::NumericLiteralPrefix

num = 01234
# good
num = 0O1234
num = 0o1234
# bad
@example EnforcedOctalStyle: zero_only
num = 1234
num = 0b10101
num = 0x12AB
num = 0o1234
# good
num = 0d1234
num = 0D1234
# bad - redundant decimal prefix
num = 0B10101
num = 0X12AB
num = 0O1234
# bad - uppercase prefix
num = 01234
# bad - missing octal prefix
@example EnforcedOctalStyle: zero_with_o (default)
or no prefix (in case of decimals).
uppercase prefixes and corrects them to lowercase prefix
This cop checks for octal, hex, binary, and decimal literals using

def autocorrect(node)

def autocorrect(node)
  lambda do |corrector|
    type = literal_type(node)
    corrector.replace(node.source_range,
                      send(:"format_#{type}", node.source))
  end
end

def format_binary(source)

def format_binary(source)
  source.sub(/^0B/, '0b')
end

def format_decimal(source)

def format_decimal(source)
  source.sub(/^0[dD]/, '')
end

def format_hex(source)

def format_hex(source)
  source.sub(/^0X/, '0x')
end

def format_octal(source)

def format_octal(source)
  source.sub(/^0O?/, '0o')
end

def format_octal_zero_only(source)

def format_octal_zero_only(source)
  source.sub(/^0[Oo]?/, '0')
end

def hex_bin_dec_literal_type(literal)

def hex_bin_dec_literal_type(literal)
  case literal
  when HEX_REGEX
    :hex
  when BINARY_REGEX
    :binary
  when DECIMAL_REGEX
    :decimal
  end
end

def literal_type(node)

def literal_type(node)
  literal = integer_part(node)
  octal_literal_type(literal) || hex_bin_dec_literal_type(literal)
end

def message(node)

def message(node)
  self.class.const_get("#{literal_type(node).upcase}_MSG")
end

def octal_literal_type(literal)

def octal_literal_type(literal)
  if literal =~ OCTAL_ZERO_ONLY_REGEX && octal_zero_only?
    :octal_zero_only
  elsif literal =~ OCTAL_REGEX && !octal_zero_only?
    :octal
  end
end

def octal_zero_only?

def octal_zero_only?
  cop_config['EnforcedOctalStyle'] == 'zero_only'
end

def on_int(node)

def on_int(node)
  type = literal_type(node)
  return unless type
  add_offense(node)
end