Есть ли у нас способ применить несколько форматов к числам в Python 3.x?

#python #python-3.x

#python #python-3.x

Вопрос:

Проблема довольно проста, у меня есть число: например x = 123.234

Теперь то, что я хочу сделать, это: 1. измените на 2 знака после запятой: 123.23 ; 2. добавьте 2 нуля спереди: 00123.45 ; 3. добавьте 2 x-s в конце: 00123.45xx ; 4. и если мой x изменится на x = 1234.2345 , то мой конечный результат будет 01234.2345x

Я знаю, как получить ответ с помощью некоторого кода, но я просто хочу спросить, есть ли способ, которым я могу объединить все форматы в 1 строку, например:

 "{:.2f,0>A,x<B}".format(number)
  

где A, B — это некоторое значение, которое вы можете установить

тогда это выдаст мне строку, хотя и бессмысленную, 00123.45xx

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

1. Вы хотите дополнить число двумя нулями до определенной длины или вы хотите всегда добавлять ровно два нуля …?

2. Что мешает вам написать 00 и xx до и после заполнителя формата?

3. с определенной длиной, которую можно установить самостоятельно … ровно с 2 нулями / x я могу просто ’00’ string ‘xx’ без проблем … возможно, мой вопрос слишком странный 🙂

4. Вы хотите добавить 0 впереди, а x в конце числа с плавающей запятой?

Ответ №1:

Если вы хотите дополнить число нулями определенной длины:

 '{:0>8.2f}'.format(123.234)  # 00123.23
  

Если вы всегда хотите добавить ровно 2 нуля:

 '00{:.2f}'
  

И это также должно сделать очевидным, как применить два завершающих xxs:

 '00{:.2f}xx'
  

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

1. да, я знаю, что мы можем получить 00123.23, используя ‘{:0> 8.2f}’.format(123.234); и мы можем получить 123.23xx, используя ‘{: x<8.2f}’.format(123.234), но, похоже, мы не можем просто объединить эти два формата в один…

2. Вы хотите выровнять по центру с разным заполнением слева и справа …?

3. может быть, другой пример: вы можете изменить x = 5 на x = 5,00, используя «{: .2f}».format(x), вы также можете изменить x = 5 на x = 05, используя «{: 0> 2d}».format(x); но если я хочу изменить x = 5 на x = 05,00, кажется, мы не можем использовать «{: 2f, 0> 2d}».format (x), мы не можем указать несколько форматов в этом {}

4. Было бы действительно полезно, если бы вы могли формализовать свои ожидания в виде простого предложения на английском языке, например «выровнять по центру с помощью разных предварительных и последующих отступов»…

5. «Применение нескольких форматов» — это всего лишь средство для достижения цели . Это не описывает, что вы на самом деле пытаетесь сделать. Для любой конкретной конечной цели может быть очень краткий способ сделать это с помощью строки формата; но для других целей такой строки формата не существует, и вам нужно использовать какое-то другое решение. В общем, нет, «несколько форматов» — это не то, но, вероятно, есть тесно связанное решение. Также смотрите xyproblem.info .

Ответ №2:

С переменной точностью, предварительной шириной и последующей шириной:

 >>> "{:0>{prewidth}.{prec}f}{:x<{postwidth}s}".format(123.456, '', prec=2, prewidth=8, postwidth=2)
'00123.45xx'
  

или их варианты.

Смотрите также страницу PyFormat.

Ответ №3:

 >>> x = 123.456
>>> A = 5
>>> B = 2
>>> '{:0{}.{}f}'.format(x,A B 1,B) ('X'*(str(x)[::-1].find('.')-B))
'00123.46X'

>>> x = 1234.5678
>>> A = 7
>>> B = 2
>>> '{:0{}.{}f}'.format(x,A B 1,B) ('X'*(str(x)[::-1].find('.')-B))
'0001234.57XX'
  

Преимущество этого: полностью модульный.
A — это общее количество чисел перед . , B — это количество десятичных знаков, которых не должно быть X . Остальные десятичные знаки являются X .

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

1. Конечно. TBH Я здесь только для того, чтобы научиться решать проблемы других людей 🙂

Ответ №4:

В настоящее время я использую этот код:

 x = 13.23456

k = "{:x<10s}".format("{:0>8.2f}".format(x))
print(k) #00013.23xx
  

и если вы измените длину x, общая длина результата останется прежней, хотя по-прежнему будут 0 и x:

 x = 123.23456

k = "{:x<10s}".format("{:0>8.2f}".format(x))
print(k) #00123.23xx
  

кажется, у нас нет способа объединить {:x<10s} и {:0> 8.2f} в один:

 #not possible: {:0>8.2f, x<10s}.format(x)