#python #python-3.x #string-formatting
#python #python-3.x #форматирование строки
Вопрос:
Я хочу отформатировать некоторые значения с фиксированной точностью 3, если это не целое число. В этом случае мне не нужны никакие десятичные или конечные 0.
Согласно документам, тип ‘f’ при форматировании строки должен удалять десятичную точку, если за ней не следуют цифры:
Если после десятичной точки не следует ни одной цифры, десятичная точка также удаляется, если не используется параметр # .
Но, тестируя его с помощью python3.8, я получаю следующие результаты:
>>> f'{123:.3f}'
'123.000'
>>> f'{123.0:.3f}'
'123.000'
Я что-то недопонимаю? Как я мог бы достичь желаемого результата, не используя проверки if else?
Комментарии:
1. В обоих ваших примерах есть цифры, следующие за десятичной запятой.
2. как 123 имеет следующие цифры после десятичной точки?
3. В документах говорится о
.3f
части, а не о значении, которое форматируется. Это 3 цифры. Используйте.0f
, и десятичная точка исчезнет из вашего вывода. Я боюсь, что для достижения того, чего вы хотите, вам придется быть более подробным и проверять тип.4. Потому что вы запросили три цифры после десятичной запятой. Сравните
.0f
и#.0f
.5. о, теперь я понимаю, спасибо за объяснения
Ответ №1:
Чтобы принудительно достичь обоих желаемых результатов с помощью одного и того же выражения f-string, вы могли бы применить некоторые кунг-фу, такие как
i = 123
f"{i:.{3*isinstance(i, float)}f}"
# '123'
i = 123.0
f"{i:.{3*isinstance(i, float)}f}"
# '123.000'
Но это не улучшит ваш код с точки зрения удобочитаемости. Нет никакого вреда в том, чтобы быть более явным.
Комментарии:
1. Это умный способ добиться того, чего я хочу. Но да, я согласен с вами по поводу удобочитаемости. Я воспользуюсь вашим советом и использую явный метод.