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
Checks for octal, hex, binary, and decimal literals using
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 OCTAL_ZERO_ONLY_REGEX.match?(literal) && octal_zero_only? :octal_zero_only elsif OCTAL_REGEX.match?(literal) && !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) do |corrector| corrector.replace(node, send(:"format_#{type}", node.source)) end end