Ruby Algorithm — valid ISBN10

Another algorithm that I found online it’s a method to check if a string is a valid ISBN10 or not.

Firstly let’s find out what a valid ISBN 10 is.

ISBN is the acronym for International Standard Book Number. This 10 or 13-digit number (in our case 10) identifies a specific book, an edition of a book, or a book-like product (such as an audiobook). Since 1970 each published book has a unique ISBN. ( Find out more here: link)

ISBN-10 identifiers are ten digits long. The first nine characters are digits 0-9. The last digit can be 0-9 or X, to indicate a value of 10.

An ISBN-10 number is valid if the sum of the digits multiplied by their position modulo 11 equals zero.

I decided to work in Ruby this time, and now if we know what we need to create, let’s start by building some tests to validate our work.

I created some tests about the sum of the digits and also if the last digit is X to make sure and change it into a 10.

Now let’s get to solving it.

Before going into anything let’s return false if we receive as input a string with more than 10 digits.

return false if isbn.size != 10

Now let’s create to main variable total and output.

total = 0

output = true

We are going to use those later.

To check each digit I will iterate over then (converted into an array firstly) and do some checks. I will use each_with_index as we’re going to need the position of each digit.

The checks we need to do ar the following:

  • If the index of the number is equal to 9 (as it will be the last one) and is the digit is “X” to make the assignment to the number variable the value of 10.
  • If the digit is any other number to assign the output with a false value. Otherwise to add to the total variable the number, converted to an integer and multiplied by its index + 1.

Finally, we need to return the output variable and make sure the total modulo 11 equals zero.

Conclusion

What I learned from here is that Tests are very important. Without them, I didn’t check if the digit was an integer and 0%11=0. The method will return true if we pass as input 10 letters.

Full Stack Web Developer | antonzaharia.com