Debug an ISBN Validator - Debug an ISBN Validator

Tell us what’s happening:

My code returns the right message for a valid ISBN but not for invalid ISBN. I can’t get past step 11.

Your code so far

def validate_isbn(isbn, length):
    if len(isbn, length) != length:
        print(f'ISBN-{length} code should be {length} digits long.')
        return
    main_digits = isbn[0:length]
    given_check_digit = isbn[length]
    main_digits_list = [int(digit) for digit in main_digits]
    # Calculate the check digit from other digits
    if length == 10:
        expected_check_digit = calculate_check_digit_10(main_digits_list)
    else:
        expected_check_digit = calculate_check_digit_13(main_digits_list)
    # 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.')
        return in_isbn == True
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)
    global checker
    checker = int(expected_check_digit)
    return expected_check_digit
def main():
    user_input = input('Enter ISBN and length: ')
    if ',' not in user_input:
        print('Enter comma-separated values.')
    values = user_input.split(',')
    isbn = values[0]

    digits = len(values[0])
    
    
    
    try:
        isbn = int(values[0])
    except:
        print("Invalid character was found.")

    try:
        length = int(values[1])
    except:
        print("Length must be a number.")

    try:
        user_input=input('Enter ISBN and length:')
        len(str(isbn)) != length
    except:
        print ("Invalid ISBN Code.")

    length = int(values[1])

    try:
        user_input=input('Enter ISBN and length:')
        len(str(isbn)) != length
    except:
        print ("Invalid ISBN Code.")

    if length == 10 and digits != 10:
        print ('Length should be 10') 

    if length == 13 and digits != 13:
        print ('Length should be 13.')

    if length == 10 or length == 13:
        print('Valid ISBN Code.')
        validate_isbn(isbn, length)
        return
    else:
        print('Length should be 10 or 13.')
    
    
    
#main()

Your browser information:

User Agent is: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36

Challenge Information:

Debug an ISBN Validator - Debug an ISBN Validator

Tell us what’s happening:

My code returns the right message for a valid ISBN but not for invalid ISBN.

I can’t get past step 11.

Your code so far

def validate_isbn(isbn, length):
    if len(isbn, length) != length:
        print(f'ISBN-{length} code should be {length} digits long.')
        return
    main_digits = isbn[0:length]
    given_check_digit = isbn[length]
    main_digits_list = [int(digit) for digit in main_digits]
    # Calculate the check digit from other digits
    if length == 10:
        expected_check_digit = calculate_check_digit_10(main_digits_list)
    else:
        expected_check_digit = calculate_check_digit_13(main_digits_list)
    # 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.')
        return in_isbn == True
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)
    global checker
    checker = int(expected_check_digit)
    return expected_check_digit
def main():
    user_input = input('Enter ISBN and length: ')
    if ',' not in user_input:
        print('Enter comma-separated values.')
    values = user_input.split(',')
    isbn = values[0]

    digits = len(values[0])
    
    
    
    try:
        isbn = int(values[0])
    except:
        print("Invalid character was found.")

    try:
        length = int(values[1])
    except:
        print("Length must be a number.")

    try:
        user_input=input('Enter ISBN and length:')
        len(str(isbn)) != length
    except:
        print ("Invalid ISBN Code.")

    length = int(values[1])

    try:
        user_input=input('Enter ISBN and length:')
        len(str(isbn)) != length
    except:
        print ("Invalid ISBN Code.")

    if length == 10 and digits != 10:
        print ('Length should be 10') 

    if length == 13 and digits != 13:
        print ('Length should be 13.')

    if length == 10 or length == 13:
        print('Valid ISBN Code.')
        validate_isbn(isbn, length)
        return
    else:
        print('Length should be 10 or 13.')
    
    
    
#main()

Your browser information:

User Agent is: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36

Challenge Information:

Debug an ISBN Validator - Debug an ISBN Validator

I went ahead and combined your posts for you. In the future, just reply to the original thread to add further updates.

Welcome to the forum @apetitfrere1 !

How are you testing your code? When I enter the values in Test #11, I see this in the console:

Enter ISBN and length: 
1530051125,10
Enter ISBN and length:

Happy coding!

it should work now, I updated the code.

def validate_isbn(isbn, length):
    if len(isbn, length) != length:
        print(f'ISBN-{length} code should be {length} digits long.')
        return
    main_digits = isbn[0:length]
    given_check_digit = isbn[length]
    main_digits_list = [int(digit) for digit in main_digits]
    # Calculate the check digit from other digits
    if length == 10:
        expected_check_digit = calculate_check_digit_10(main_digits_list)
    else:
        expected_check_digit = calculate_check_digit_13(main_digits_list)
    # 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.')
        return in_isbn == True
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)
    global checker
    checker = int(expected_check_digit)
    return expected_check_digit
def main():
    user_input = input('Enter ISBN and length: ')
    if ',' not in user_input:
        print('Enter comma-separated values.')
    values = user_input.split(',')
    isbn = values[0]

    digits = len(values[0])   
    
    try:
        isbn = int(values[0])
    except:
        print("Invalid character was found.")

    try:
        length = int(values[1])
    except:
        print("Length must be a number.")

    try:
        user_input=input('Enter ISBN and length:')
        len(str(isbn)) != length
    except:
        print ("Invalid ISBN Code.")

    length = int(values[1])

    if length == 10 and digits != 10:
        print ('Length should be 10') 

    if length == 13 and digits != 13:
        print ('Length should be 13.')

    if length == 10 or length == 13:
        print('Valid ISBN Code.')
        validate_isbn(isbn, length)
        return
    else:
        print('Length should be 10 or 13.')
    
    
    
main()

Test your code!

Enter ISBN and length: 
1234567890
Enter comma-separated values.
Length must be a number.
Enter ISBN and length:

Should your code continue processing if it doesn’t receive a length?

You may need to revisit the theory lectures on error handling.

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.