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.