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)
-
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