Запись с фиксированной запятой не работает в соответствии с документацией

#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. Это умный способ добиться того, чего я хочу. Но да, я согласен с вами по поводу удобочитаемости. Я воспользуюсь вашим советом и использую явный метод.