multiple examples example python string-formatting aix

python - examples - ¿Por qué puede "%.10f"% Decimal(u) emitir una cadena con dos puntos literales?



python format repeat string (1)

Aunque no es una "respuesta", puedo darle mis resultados en una versión ligeramente más reciente que se ejecuta en AIX.

Perdón por no poder replicar tu problema.

[lholtscl@ibm3 ~]$ python Python 2.7.13 (default, Sep 7 2017, 21:08:50) [C] on aix7 Type "help", "copyright", "credits" or "license" for more information. >>> print "%.10f" % 123456789012 123456789012.0000000000 >>> ''{0:.10f}''.format(123456789012) ''123456789012.0000000000''

Al formatear un número para imprimir, se están formateando números de 12 dígitos con dos puntos inmediatamente después del punto. ¿Por qué está pasando esto? Esto es Python 2.7 en un sistema AIX.

$ uname -a ; /opt/bin/python2.7 AIX myserver 1 6 00F6A5CC4C00 Python 2.7.12 (default, Sep 29 2016, 12:02:17) [C] on aix5 Type "help", "copyright", "credits" or "license" for more information. >>> ''{0:.10f}''.format(123456789012) ''123456789011.:000000000'' >>> from decimal import Decimal >>> u=123456789012 >>> print "%.10f" % Decimal(u) 123456789011.:000000000

Más información:

No es cada número de 12 dígitos:

>>> for x in range(123456789010,123456789020): ... print ''{0:.10f}''.format(x) ... 12345678900:.0000000000 123456789010.:000000000 123456789011.:000000000 123456789013.0000000000 123456789013.:000000000 123456789015.0000000000 123456789016.0000000000 123456789017.0000000000 123456789017.:000000000 123456789019.0000000000

Esto no está sucediendo con ningún otro número de longitud. Además, probé printf de bash y perl y esto no está pasando con ninguno de ellos.

¿Que está sucediendo aquí?

Según lo solicitado, aquí hay un video de captura de pantalla .

Información más solicitada:

>>> import locale >>> locale.getdefaultlocale() (''en_US'', ''ISO8859-1'')

Resultado del código pastebin user2357112:

>>> import ctypes >>> f=ctypes.pythonapi.PyOS_double_to_string >>> f.argtypes=ctypes.c_double,ctypes.c_char,ctypes.c_int,ctypes.c_int,ctypes.POINTER(ctypes.c_int)) >>> f.restype=ctypes.c_char_p >>> print f(123456789012.0, ''f'', 10, 0, None) 123456789011.:000000000

El pastebin de Antti_Happa imprimió todos los números correctamente.

Usar el formato r da:

print ''e: {0:.10e}/nf: {0:.10f}/ng: {0:.10g}/nr: {0:0r}''.format(x) ValueError: Unknown format code ''r'' for object of type ''int''

El uso de los formatos e, f yg proporciona lo siguiente:

for x in range(123456789000,123456789019): print ''e: {0:.10e}/nf: {0:.10f}/ng: {0:.10g}''.format(x) e: 1.2345678900e+11 f: 123456789000.0000000000 g: 1.23456789e+11 e: 1.2345678900e+11 f: 123456789000.:000000000 g: 1.23456789e+11 e: 1.2345678900e+11 f: 123456789001.:000000000 g: 1.23456789e+11 e: 1.2345678900e+11 f: 123456789003.0000000000 g: 1.23456789e+11

No tengo acceso para instalar o actualizar nada en este servidor. Puedo solicitar una versión actualizada, pero las solicitudes de cambio de esta naturaleza requieren bastante tiempo. Además, otros programas dependen de esta instalación y se requerirán muchas pruebas.

Se me informó que solo se instalarán paquetes proporcionados por IBM y que el último paquete de python 2.7 proporcionado por IBM es 2.7.12.

He "arreglado" el problema haciendo

othervar = ''{0:.10f}''.format(somevar).replace('':'', ''0'')

que es extremadamente inseguro, lo sé, pero ... encogimiento de hombros

Argh! Me acabo de dar cuenta de un error de uno a uno ... 123456789012 se está formateando como uno menos: 123456789011.:0000000000 ... este es un error extraño.