diff --git a/lib/faker/default/bank.rb b/lib/faker/default/bank.rb index 940ef23d97..75a8364595 100644 --- a/lib/faker/default/bank.rb +++ b/lib/faker/default/bank.rb @@ -58,8 +58,11 @@ def swift_bic def checksum(num_string) num_array = num_string.split('').map(&:to_i) - digit = (7 * (num_array[0] + num_array[3] + num_array[6]) + 3 * (num_array[1] + num_array[4] + num_array[7]) + 9 * (num_array[2] + num_array[5])) % 10 - digit == num_array[8] + ( + 7 * (num_array[0] + num_array[3] + num_array[6]) + + 3 * (num_array[1] + num_array[4] + num_array[7]) + + 9 * (num_array[2] + num_array[5]) + ) % 10 end def compile_routing_number @@ -85,12 +88,15 @@ def iban_checksum(country_code, account) end def valid_routing_number - for _ in 0..50 - micr = compile_routing_number + routing_number = compile_routing_number + checksum = checksum(routing_number) + return routing_number if valid_checksum?(routing_number, checksum) - break if checksum(micr) - end - micr + routing_number[0..7] + checksum.to_s + end + + def valid_checksum?(routing_number, checksum) + routing_number[8].to_i == checksum end def compile_fraction(routing_num) diff --git a/test/faker/default/test_faker_bank.rb b/test/faker/default/test_faker_bank.rb index 38914f1e9f..54e27ed966 100644 --- a/test/faker/default/test_faker_bank.rb +++ b/test/faker/default/test_faker_bank.rb @@ -10,7 +10,15 @@ def setup end def test_routing_number - assert Faker::Bank.routing_number.match(/\d{9}/) + routing_number = Faker::Bank.routing_number + checksum = ( + 7 * (routing_number[0].to_i + routing_number[3].to_i + routing_number[6].to_i) + + 3 * (routing_number[1].to_i + routing_number[4].to_i + routing_number[7].to_i) + + 9 * (routing_number[2].to_i + routing_number[5].to_i + routing_number[8].to_i) + ) % 10 + + assert routing_number.match(/\d{9}/) + assert_equal(checksum, 0) end def test_routing_number_with_format