Debug an ISBN Validator - Debug an ISBN Validator

Tell us what’s happening:

Unable to get test 9, 14 and 20 through. There is a invalid character problem and a math problem

Your code so far

def validate_isbn(isbn, length):
    if len(isbn) != length:
        print(f'ISBN-{length} code should be {length} digits long.')
        return
    if length == 10:
        if isbn.lower()[-1]=="x":
            main_digits = isbn[0:length-1]
        else:
            main_digits = isbn[0:length]
    else:
            main_digits = isbn[0:length]
    print(main_digits)
    given_check_digit = isbn[length-1]
    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
    print(f'Comparing {given_check_digit} and {expected_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
    print(digits_sum)
    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
    print(main_digits_list)
    for index, digit in enumerate(main_digits_list):
        if index % 2 == 0:
            print(index)
            digits_sum += digit * 1
        else:
            print(index)
            digits_sum += digit * 3
    # Find the remainder of dividing the sum by 10, then subtract it from 10
    print(digits_sum)
    result = 10 - digits_sum % 10
    print(result)
    # 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: ')
    try:
        values = user_input.split(',')
        isbn = values[0]
        print(f"{isbn} with {len(isbn)}")
        length = int(values[1])
        print(length)
        if length == 13:
            if not isinstance(isbn,int):
                print("Invalid character was found.")
        elif length == 10:
            if isbn.lower()[-1]=="x":
                for num in isbn[:len(isbn)-1]:
                    if not isinstance(int(num),int):
                     print("Invalid character was found.")
            else:
               if not isinstance(int(isbn),int):
                print("Invalid character was found.")
        if length == 10 or length == 13:
            validate_isbn(isbn, length)
        else:
            print('Length should be 10 or 13.')
    except IndexError:
        print("Enter comma-separated values.")
    except ValueError:
        print("Length must be a number.")
       
validate_isbn("9781947172104", 13)
# main()

Your browser information:

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

Challenge Information:

Debug an ISBN Validator - Debug an ISBN Validator

This is not the way to test. This function is called in main().

Please uncomment your call to main() and enter the isbn and length at the prompt. You only need to comment main() when you run the tests.

Yes i have tried with only main also it still fails 14 and 20
It says Invalid character was found and Comparing 4 and 0 Invalid ISBN Code

  1. When the user enters 15-0051126,10, you should see the message Invalid character was found..

When I test your program with that input:

Enter ISBN and length: 
15-0051126,10
15-0051126 with 10
10
Length must be a number.

Does this help you narrow down the problem?

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