mirror of
https://github.com/python/cpython.git
synced 2025-08-02 16:13:13 +00:00
Issue 1742669. Now %d accepts very big float numbers.
Thanks Gabriel Genellina.
This commit is contained in:
parent
b93e7d16d5
commit
c11cecf3d0
4 changed files with 118 additions and 32 deletions
|
@ -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';
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue