Как я могу сохранить ноль в python для расчета?

#python

Вопрос:

Поэтому я должен был проверить, является ли входной номер номером UPC или нет. Я должен разрешить начальные нули и учесть их при расчете.

Вот мой текущий код, он работает для всех чисел, кроме числа с начальными нулями:

Условие для кода UPC действительно:

  • Вычислите сумму умножения индекса нечетных цифр на 3 и индекса четных цифр на 1 входного числа.
  • Вычислите сумму, которую мы только что сделали по модулю 10, получите цифру результата.
  • Если результирующая цифра находится между 1 и 9, то вычтите результирующую цифру из 10. Если результирующая цифра равна 0, добавьте 0 к базовому номеру, чтобы получить завершенное число.
 def UPC_code(num):
    sum_digit = 0
    index = 0
    num_temp = str(num)[:-1]
    len_nt = len(num_temp)

    for digit in num_temp:                  
        if (index   1) % 2 != 0:            # If number position is odd
            sum_digit  = int(digit) * 3     # Sum = digit * 3
            if index < len_nt:              # Increase index till end
                index  = 1
        elif (index   1) % 2 == 0:          # If number position is even
            sum_digit  = int(digit) * 1     # Sum = digit * 1
            if index < len_nt:
                index  = 1
    # print(sum_digit)

    res_digit = sum_digit % 10
    if 1 <= res_digit <= 9:
        res_digit = 10 - res_digit      # Res digit meet condition = 10 - res digit

    if res_digit == num % 10:
        return True
    elif res_digit != num % 10:
        return False
    else:
        print("Something went wrong")
# End UPC_code()
 

Вызовите UPC_code()

 import code_check.py as cc

num = str(input())
num_int = int(num)
if cc.UPC_code(num_int) is True and num_int != 0:
    print(num, "valid UPC code.")
else:
    print("Not valid")
 

Ожидаемый вклад:

 042100005264
 

Ожидаемый результат:

 042100005264 valid UPC code
 

Фактический объем производства:

 Not valid
 

Комментарии:

1. Каковы условия для того, чтобы код UPC был действительным?

2. @not_speshal Я добавил его, большое спасибо!

3. Вы можете значительно упростить свой код с помощью нарезки строк. Предполагая использование num в качестве 12-значной строки, sum(int(x) for x in num[:-1:2]) будет вычислена сумма нечетных цифр и sum(int(x) for x in num[1:-1:2]) будет вычислена сумма четных цифр. В последнем случае 1:-1:2 означает «начните с индекса 1 (2-я цифра), до последней цифры, но не включая последнюю цифру, шаг за шагом 2». Тогда контрольная цифра становится check = (10 - (odd * 3 even) % 10) % 10 .

Ответ №1:

это работает для всех чисел, кроме числа с начальными нулями

Как вы, несомненно, обнаружили, python не позволяет вам писать 0700 . Исторически это означало 0o700 бы или 448 , что, скорее всего, не то, что вы хотите в любом случае…

В этом случае решение простое. Если вам нужно обрабатывать числа , например 00007878979345 , обрабатывать строки.

Таким образом, переработайте свой код, чтобы получить строку. В качестве бонуса, int("000008") есть 8 , так что, когда вам нужен номер как номер, вам даже не нужно ничего делать.

Комментарии:

1. Правильный. Все, что ему нужно сделать, это изменить входные данные для своей функции на строку, а затем он может переходить по одному символу за раз, проводить тест и снова выводить строку, если она пройдет.

2. Спасибо за вашу помощь! Я искал вокруг в то же время, но, похоже, невозможно заставить его работать с чистым интергером.

3. действительно—из-за исторического значения ведущих нулей (означающих восьмеричное число)