Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save whysthatso/5916931 to your computer and use it in GitHub Desktop.
Save whysthatso/5916931 to your computer and use it in GitHub Desktop.
Ruby script for calculating the checksum of a 2..20 range integer following the 7-3-1 method. Estonian Bank Union / Eesti Pangaliit - Reference number / Viitenumber
#!/usr/bin/env ruby
#
########################################################
#
# What is this?
#
# script can calculate the checksum of a 2..20 range integer following the 7-3-1 method.
#
# Details
# 1. run on cli, script asks for number entry
# 2. calculates checksum
# 3. spits out original value and checksum
#
# Gossip
# This is the produce of a beginner ruby scripter, so any best-practice/bug-slashing/constructive
# comments are more than # appreciated. I hope this will help implement the reference number
# calculation more quickly for other starters than it took me.
#
# Credits
# def calc_ref_number is a translation of a php method from here:
# Estonian Bank Union / Eesti Pangaliit - Reference number / Viitenumber
# http://www.pangaliit.ee/en/settlements-and-standards/check-digit-calculator-of-domestic-account-number
#
############################################################
#### Methods
# for use on cli, not sure if the instance method is good practice, but it works
def get_value
print '> '
@value = gets.chomp
end
# Rescueing rather than regexing the check for an integer
# problems: 09, 08 trigger because they are interpreted as octal ( did not matter for use case)
def integer?(str)
!!Integer(str) rescue false
end
# check if this a valid entry (length, integer)
# i dare you, make this shorter
def check_value(str)
if integer?(str)
puts 'Value is integer'
#not sure if this is needed?
@value = str
case
when @value.length < 2
puts "Value needs to be longer than 1"
get_value
check_value(@value)
when @value.length > 19
puts "Value needs to be shortern than 19"
get_value
check_value(@value)
else
puts "Alright, here's your Reference number"
calc_ref_number(@value)
end
else
puts "Please enter a number"
get_value
check_value(@value)
end
end
#do the actual calculation
def calc_ref_number(int)
# split string of numbers and push it into array
weight = [1,3,7]
# associating sl and st with the integer value of the amount of digits
sl = st = int.length
total = 0
# while lenght is higher than 0 and the last position on the string is higher than 0
while sl > 0 && int[sl - 1] >= '0'
# calculate the last digit's product with the associated member of the array
total += subtotal = (int[st-1-sl].to_i * weight[ sl%3 ])
sl = sl-1
end
kontrollnr = (total.to_f / 10).ceil * 10 - total
puts int.to_s + kontrollnr.to_s
end
#### Program
puts 'Calculate reference number'
puts
puts 'Enter value between 2 and 20'
get_value
check_value(@value)
@juhank
Copy link

juhank commented Oct 13, 2013

maybe you could use regexp to validate the input:

def check_value(str)
    if /^[1-9]{1}[0-9]{1,18}$/.match(str) == nil
        puts "incorrect format."
    else 
        puts "do stuff"
    end
end

@artur-intech
Copy link

artur-intech commented Jan 17, 2019

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment