Formato del objeto decimal de Python a una precisión especificada

He pasado innumerables horas investigando, leyendo, probando y, en última instancia, confundido y consternado por la falta del concepto más fundamental del objeto decimal de Python: dar formato a la salida de un decimal a una cadena.

Supongamos que tenemos algunas cadenas u objetos decimales con los siguientes valores:

0.0008 11.1111 222.2222 3333.3333 1234.5678 

El objective es simplemente establecer la precisión del decimal en la segunda posición decimal. Por ejemplo, 11.1111 se formatearía como 11.11 y 1234.5678 como 1234.57 .

Imagino un código similar al siguiente:

 import decimal decimals = [ decimal.Decimal('0.0008'), decimal.Decimal('11.1111'), decimal.Decimal('222.2222'), decimal.Decimal('3333.3333'), decimal.Decimal('1234.5678'), ] for dec in decimals: print dec.as_string(precision=2, rounding=ROUND_HALF_UP) 

La salida resultante sería:

 0.00 11.11 222.22 3333.33 1234.57 

Obviamente, no podemos hacer uso de la precisión del contexto de la Decimal, porque esto toma en consideración el número TOTAL de dígitos, no solo la precisión decimal.

Tampoco estoy interesado en convertir el decimal en un flotante para generar su valor. La razón ENTERA detrás de Decimal es evitar almacenar y ejecutar cálculos en flotadores.

¿Qué otras soluciones hay? Entiendo que hay muchas otras preguntas similares sobre el desbordamiento de stack, pero no he encontrado ninguna para resolver el problema subyacente que estoy investigando.

¡Muchas gracias!

Simplemente use el formato de cadena o la función format() :

 >>> for dec in decimals: ... print format(dec, '7.2f') ... 0.00 11.11 222.22 3333.33 1234.57 

decimal.Decimal admite las mismas especificaciones de formato que los flotantes, por lo que puede usar el formato de exponente, punto fijo, general, número o porcentaje según sea necesario.

Este es el método oficial y pythonic de formatear decimales; La clase Decimal implementa el método .__format__() para manejar dicho formato de manera eficiente.

 def d(_in, decimal_places = 3): ''' Convert number to Decimal and do rounding, for doing calculations Examples: 46.18271 to 46.183 rounded up 46.18749 to 46.187 rounded down 117.34999999999999 to 117.350 _rescale is a private function, bad practice yet works for now. ''' return Decimal(_in)._rescale(-decimal_places, 'ROUND_HALF_EVEN') 

Edición: Nuevamente, _rescale () no está destinado a ser usado por nosotros como biped regulares, funciona en Python 2.7, no está disponible en 3.4.