Debug an ISBN Validator - Debug an ISBN Validator

Tell us what’s happening:

i haven’t been able to fix the TypeError and IndexError that shows up when I input a valid isbn number. As the terminal outputs nothing when I input a valid isbn number in fact after anything I input nothing shows up I haven’t modified anything :smiling_face_with_tear:

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[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.')
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: ')
    values = user_input.split(',')
    isbn = values[0]
    try:
       length = int(values[1])
    except IndexError:
        print('Enter comma-separated values.')
        if length == 10 or length == 13:
            validate_isbn(isbn, length)
        else:
            print('Length should be 10 or 13.')
    except ValueError:
        print('Length must be a number.')

main()

Your browser information:

User Agent is: Mozilla/5.0 (X11; CrOS x86_64 14541.0.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36

Challenge Information:

Debug an ISBN Validator - Debug an ISBN Validator

GitHub Link: https://github.com/freeCodeCamp/freeCodeCamp/blob/main/curriculum/challenges/english/blocks/lab-isbn-validator/686b9720ee1d032bd77a480a.md

Let’s figure it out together. Let’s find out what your validate_isbn function actually does first.

I want you to to call it with `1530051126` and `10` as arguments and see what the console says first. Then reply with it in this thread.

it says:
ISBN-10 code should be 10 digits long.
None

Okay so both of them are technically 10. That’s something we know for sure.

BUT we also know know that they are not exactly the same thing otherwise we wouldn’t have this issue. Do we know the data types of len(isbn) and length? As variable data types are sensitive in this programming languages, this could explain a potential issue.

Hi @Fireeditor_360,

Where in your code are you checking to see if the ISBN has invalid characters like “-”?

Should your if/else statements be inside the except?

Update:

[quote=“Fireeditor_360, post:1, topic:791981”]
values = user_input.split(',')
[/quote]

Can your code ever catch an IndexError if the code that could cause that is not inside a try statement?

Happy coding