Debug an ISBN Validator - Debug an ISBN Validator

Tell us what’s happening:

Hi, I am testing the code and cant get a “Valid ISBN Code” message for my input (step 9). This is the console output (I added a few print statements to help myself understand what is going on):

Enter ISBN and length:
1530051126,10
Turning ISBN into an integer…
ISBN is now an integer…
Length is now an integer…
given check digit: 6
main digit list: [1, 5, 3, 0, 0, 5, 1, 1, 2, 6]
expected check digit: 0
Invalid ISBN Code.

I do comment out main() when i run the tests.

Your code so far

def validate_isbn(isbn, length):
    if len(isbn) != length:
        print(f'ISBN-{length} code should be {length} digits long.')
        return

    main_digits = isbn[0:length]
    given_check_digit = isbn[-1]
    print("given check digit: ",given_check_digit)
    
    main_digits_list = [int(digit) for digit in main_digits]
    print("main digit list: ", main_digits_list)
    # Calculate the check digit from other digits
    if length == 10:
        expected_check_digit = calculate_check_digit_10(main_digits_list)
        print("expected check digit: ", expected_check_digit)
    else:
        expected_check_digit = calculate_check_digit_13(main_digits_list)
        print("expected check digit: ", expected_check_digit)
    # Check if the given check digit matches with the calculated check digit
    if given_check_digit == expected_check_digit:
        print('Valid ISBN Code.')
    else:
        print('Invalid ISBN Code.')
def calculate_check_digit_10(main_digits_list):
    # Note: You don't have to fully understand the logic in this function.
    digits_sum = 0
    # Multiply each of the first 9 digits by its corresponding weight (10 to 2) and sum up the results
    for index, digit in enumerate(main_digits_list):
        digits_sum += digit * (10 - index)
    # Find the remainder of dividing the sum by 11, then subtract it from 11
    result = 11 - digits_sum % 11
    # The calculation result can range from 1 to 11.
    # If the result is 11, use 0.
    # If the result is 10, use upper case X.
    # Use the value as it is for other numbers.
    if result == 11:
        expected_check_digit = '0'
    elif result == 10:
        expected_check_digit = 'X'
    else:
        expected_check_digit = str(result)
    return expected_check_digit
def calculate_check_digit_13(main_digits_list):
    # Note: You don't have to fully understand the logic in this function.
    digits_sum = 0
    # Multiply each of the first 12 digits by 1 and 3 alternately (starting with 1), and sum up the results
    for index, digit in enumerate(main_digits_list):
        if index % 2 == 0:
            digits_sum += digit * 1
        else:
            digits_sum += digit * 3
    # Find the remainder of dividing the sum by 10, then subtract it from 10
    result = 10 - digits_sum % 10
    # The calculation result can range from 1 to 10.
    # If the result is 10, use 0.
    # Use the value as it is for other numbers.
    if result == 10:
        expected_check_digit = '0'
    else:
        expected_check_digit = str(result)
    return expected_check_digit

def main():
    user_input = input('Enter ISBN and length: ')
    if ',' not in user_input:
        print('Enter comma-separated values.')
        return
    ## Another way I saw this done on the forums:     
    #if user_input.find(',') == -1:
    #    print('Enter comma-separated values.')
    #    return
    values = user_input.split(',')
    isbn = values[0]
    if isbn.find('X') != -1:
        print('Detected an X in input, continuing...')
        pass
    else:
        print('Turning ISBN into an integer...')
        try:
            isbn = (int(isbn))
            print('ISBN is now an integer...')
        except ValueError:
            print("Invalid character was found.")
            return
    try:
        length = int(values[1])
        print('Length is now an integer...')
    except ValueError:
        print('Length must be a number.')
        return
    
    if length == 10 or length == 13:
        validate_isbn(str(isbn), length)
    else:
        print('Length should be 10 or 13.')


main()

Your browser information:

User Agent is: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:147.0) Gecko/20100101 Firefox/147.0

Challenge Information:

Debug an ISBN Validator - Debug an ISBN Validator

is the main digit list supposed to have all the digits?
if so, why are we doing this and not using isbn directly?

if it’s not supposed to have all the digits, do you think you need to update something?

1 Like

Wow thank you! That was exactly the hint I needed :smiley: it works now!