Dar formato a números a cadenas en Python

112

Necesito averiguar cómo formatear números como cadenas. Mi codigo esta aqui:

return str(hours)+":"+str(minutes)+":"+str(seconds)+" "+ampm

Las horas y los minutos son números enteros y los segundos son flotantes. la función str () convertirá todos estos números al lugar de las décimas (0.1). Entonces, en lugar de que mi cadena muestre "5: 30: 59.07 pm", mostraría algo como "5.0: 30.0: 59.1 pm".

En pocas palabras, ¿qué biblioteca / función necesito para hacer esto por mí?

David Ackerman
fuente

Respuestas:

138

A partir de Python 3.6, el formateo en Python se puede realizar utilizando cadenas literales formateadas o cadenas f :

hours, minutes, seconds = 6, 56, 33
f'{hours:02}:{minutes:02}:{seconds:02} {"pm" if hours > 12 else "am"}'

o la str.formatfunción que comienza con 2.7:

"{:02}:{:02}:{:02} {}".format(hours, minutes, seconds, "pm" if hours > 12 else "am")

o el operador de formato de cadena% para versiones incluso más antiguas de Python, pero vea la nota en los documentos:

"%02d:%02d:%02d" % (hours, minutes, seconds)

Y para su caso específico de tiempo de formateo, hay time.strftime:

import time

t = (0, 0, 0, hours, minutes, seconds, 0, 0, 0)
time.strftime('%I:%M:%S %p', t)
Konrad Rudolph
fuente
96

A partir de Python 2.6, existe una alternativa: el str.format()método. A continuación, se muestran algunos ejemplos que utilizan el operador de formato de cadena existente ( %):

>>> "Name: %s, age: %d" % ('John', 35) 
'Name: John, age: 35' 
>>> i = 45 
>>> 'dec: %d/oct: %#o/hex: %#X' % (i, i, i) 
'dec: 45/oct: 055/hex: 0X2D' 
>>> "MM/DD/YY = %02d/%02d/%02d" % (12, 7, 41) 
'MM/DD/YY = 12/07/41' 
>>> 'Total with tax: $%.2f' % (13.00 * 1.0825) 
'Total with tax: $14.07' 
>>> d = {'web': 'user', 'page': 42} 
>>> 'http://xxx.yyy.zzz/%(web)s/%(page)d.html' % d 
'http://xxx.yyy.zzz/user/42.html' 

Aquí están los fragmentos equivalentes pero usando str.format():

>>> "Name: {0}, age: {1}".format('John', 35) 
'Name: John, age: 35' 
>>> i = 45 
>>> 'dec: {0}/oct: {0:#o}/hex: {0:#X}'.format(i) 
'dec: 45/oct: 0o55/hex: 0X2D' 
>>> "MM/DD/YY = {0:02d}/{1:02d}/{2:02d}".format(12, 7, 41) 
'MM/DD/YY = 12/07/41' 
>>> 'Total with tax: ${0:.2f}'.format(13.00 * 1.0825) 
'Total with tax: $14.07' 
>>> d = {'web': 'user', 'page': 42} 
>>> 'http://xxx.yyy.zzz/{web}/{page}.html'.format(**d) 
'http://xxx.yyy.zzz/user/42.html'

Al igual que Python 2.6+, todas las versiones de Python 3 (hasta ahora) entienden cómo hacer ambas cosas. Desvergonzadamente arranqué estas cosas directamente de mi libro de introducción de Python y las diapositivas de los cursos de Introducción + Intermedio de Python que ofrezco de vez en cuando.:-)

ACTUALIZACIÓN DE AGOSTO DE 2018 : Por supuesto, ahora que tenemos la función f-string en 3.6 , necesitamos los ejemplos equivalentes de eso , sí, otra alternativa:

>>> name, age = 'John', 35
>>> f'Name: {name}, age: {age}'
'Name: John, age: 35'

>>> i = 45
>>> f'dec: {i}/oct: {i:#o}/hex: {i:#X}'
'dec: 45/oct: 0o55/hex: 0X2D'

>>> m, d, y = 12, 7, 41
>>> f"MM/DD/YY = {m:02d}/{d:02d}/{y:02d}"
'MM/DD/YY = 12/07/41'

>>> f'Total with tax: ${13.00 * 1.0825:.2f}'
'Total with tax: $14.07'

>>> d = {'web': 'user', 'page': 42}
>>> f"http://xxx.yyy.zzz/{d['web']}/{d['page']}.html"
'http://xxx.yyy.zzz/user/42.html'
wescpy
fuente
8

Python 2.6+

Es posible usar la format()función, por lo que en su caso puede usar:

return '{:02d}:{:02d}:{:.2f} {}'.format(hours, minutes, seconds, ampm)

Hay varias formas de utilizar esta función, por lo que para obtener más información puede consultar la documentación .

Python 3.6+

f-strings es una nueva característica que se ha agregado al lenguaje en Python 3.6. Esto facilita notoriamente el formateo de cadenas:

return f'{hours:02d}:{minutes:02d}:{seconds:.2f} {ampm}'
lmiguelvargasf
fuente
1

Puede utilizar lo siguiente para lograr la funcionalidad deseada

"%d:%d:d" % (hours, minutes, seconds)
Varun Chadha
fuente
1

Puede usar str.format () para hacer que Python reconozca cualquier objeto en cadenas.

HamTheBurger
fuente
0

str () en python en un número entero no imprimirá ningún lugar decimal.

Si tiene un flotante que desea ignorar la parte decimal, puede usar str (int (floatValue)).

Quizás el siguiente código lo demuestre:

>>> str(5)
'5'
>>> int(8.7)
8
Matthew Schinckel
fuente
0

Si tiene un valor que incluye un decimal, pero el valor decimal es insignificante (es decir: 100.0) e intenta ingresarlo, obtendrá un error. Parece una tontería, pero llamar a Float primero soluciona esto.

str (int (float ([variable])))

Ruz
fuente