Ситуация: мы пишем программу для бухгалтерии, программа берёт зарплату сотрудников и высчитывает, сколько они получат на руки после вычета налога 13%. Для проверки выгружаем зарплату из бухгалтерии и пишем простой код, на основе которого будем делать функцию:
# данные из бухгалтерии
salary = '120 000'
# переводим строку в число
total = int(salary)
# считаем сумму после вычета налогов
for_pay = total - total*0.13
# выводим результат
print('К выдаче: ' + str(for_pay))
Но при запуске даже такого простого кода мы получаем ошибку:
❌ ValueError: invalid literal for int() with base 10: '22 000'
Что это значит: Python не смог перевести нашу строку в число. Ещё компьютер мог предположить, что мы используем в числе не десятичную систему счисления, а какую-то другую, поэтому добавил текст про основание системы счисления: with base 10.
Когда встречается: когда мы пытаемся преобразовать в десятичное число что-то, что по мнению Python таким числом не является. Это могут быть строки, числа в другом формате или сложные объекты (например, массивы).
Что делать с ошибкой ValueError: invalid literal for int() with base 10
Давайте посмотрим, что не так с нашим кодом.
Ошибка возникает на этапе перевода строки в число, и кажется, что всё верно: в строке у нас 22 тысячи. Но система в бухгалтерии была настроена так, что она добавляет пробел, чтобы отделять разряды друг от друга. Бухгалтерам так удобнее — можно быстро понять масштаб цифр и не считать нули вручную. Компьютер ничего не знает про удобство бухгалтеров и рассуждает так:
- У меня есть строка с какими-то данными.
- Её пытаются преобразовать в целое число.
- Но внутри стоит пробел, значит, это точно не число.
- Непонятно, что делать, надо остановить выполнение кода и вывести сообщение об ошибке.
Получается, что ошибка у нас как раз из-за пробела в числе. Её можно решить двумя способами: убрать вручную пробел или написать функцию, которая сделает это за нас. Сейчас пойдём по простому пути, а когда будем писать полноценную функцию, прикрутим уже автоматическое убирание пробелов (сейчас этого делать не будем).
Убираем пробел из бухгалтерской строки и видим, что ошибка ушла, код работает как нужно:
# данные из бухгалтерии, но без пробелов
salary = '120000'
# переводим строку в число
total = int(salary)
# считаем сумму после вычета налогов
for_pay = total - total*0.13
# выводим результат
print('К выдаче: ' + str(for_pay))