Lors du formatage d'un nombre à être imprimé, à 12 chiffres sont les numéros mis en forme avec un colon immédiatement après le point. Pourquoi est-ce arrivé? C'est Python 2.7 sur un système 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
Plus d'informations:
Ce n'est pas tous les 12 chiffres du numéro de téléphone:
>>> 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
Ce n'est pas le cas avec tout autre longueur des numéros. Aussi, j'ai essayé de bash et perl printf et ce n'est pas le cas avec l'un d'eux.
Ce qui se passe ici?
Comme demandé, voici une capture d'écran de la vidéo.
Plus d'informations demandées:
>>> import locale
>>> locale.getdefaultlocale()
('en_US', 'ISO8859-1')
Résultat de user2357112 pastebin code:
>>> 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
Antti_Happa de pastebin imprimé tous les nombres correctement.
À l'aide de format r donne:
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'
À l'aide de e, f et g formats suivants:
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
Je n'ai pas d'accès pour installer ou mettre à jour quoi que ce soit sur ce serveur. Je peux demander une version mise à jour, mais les demandes de changement de cette nature, prendre une bonne quantité de temps. En outre, d'autres programmes dépendent de cette installation, et un grand nombre de tests seraient nécessaires.
J'ai été informé que seul IBM fourni paquets seront installés et que la dernière version de python 2.7 package fourni par IBM est 2.7.12.
J'ai "résolu" le problème en fait
othervar = '{0:.10f}'.format(somevar).replace(':', '0')
ce qui est extrêmement dangereux, je le sais, mais ... haussement d'épaules
Argh! Je viens de remarquer une-par-une erreur ... 123456789012
est formaté comme un moins: 123456789011.:0000000000
... c'est un bug bizarre.