Issue 1742669. Now %d accepts very big float numbers.

Thanks Gabriel Genellina.
This commit is contained in:
Facundo Batista 2008-02-24 03:17:21 +00:00
parent b93e7d16d5
commit c11cecf3d0
4 changed files with 118 additions and 32 deletions

View file

@ -4585,6 +4585,7 @@ PyString_Format(PyObject *format, PyObject *args)
int prec = -1;
int c = '\0';
int fill;
int isnumok;
PyObject *v = NULL;
PyObject *temp = NULL;
char *pbuf;
@ -4786,23 +4787,52 @@ PyString_Format(PyObject *format, PyObject *args)
case 'X':
if (c == 'i')
c = 'd';
if (PyLong_Check(v)) {
int ilen;
temp = _PyString_FormatLong(v, flags,
prec, c, &pbuf, &ilen);
len = ilen;
if (!temp)
goto error;
sign = 1;
isnumok = 0;
if (PyNumber_Check(v)) {
PyObject *iobj=NULL;
if (PyInt_Check(v) || (PyLong_Check(v))) {
iobj = v;
Py_INCREF(iobj);
}
else {
iobj = PyNumber_Int(v);
if (iobj==NULL) iobj = PyNumber_Long(v);
}
if (iobj!=NULL) {
if (PyInt_Check(iobj)) {
isnumok = 1;
pbuf = formatbuf;
len = formatint(pbuf,
sizeof(formatbuf),
flags, prec, c, iobj);
Py_DECREF(iobj);
if (len < 0)
goto error;
sign = 1;
}
else if (PyLong_Check(iobj)) {
int ilen;
isnumok = 1;
temp = _PyString_FormatLong(iobj, flags,
prec, c, &pbuf, &ilen);
Py_DECREF(iobj);
len = ilen;
if (!temp)
goto error;
sign = 1;
}
else {
Py_DECREF(iobj);
}
}
}
else {
pbuf = formatbuf;
len = formatint(pbuf,
sizeof(formatbuf),
flags, prec, c, v);
if (len < 0)
goto error;
sign = 1;
if (!isnumok) {
PyErr_Format(PyExc_TypeError,
"%%%c format: a number is required, "
"not %.200s", c, Py_TYPE(v)->tp_name);
goto error;
}
if (flags & F_ZERO)
fill = '0';