mirror of
https://github.com/php/php-src.git
synced 2025-08-20 09:24:05 +02:00
- Fix printf with floats
This commit is contained in:
parent
6d7346f4b9
commit
251b627684
1 changed files with 30 additions and 8 deletions
|
@ -65,6 +65,7 @@ static char HEXCHARS[] = "0123456789ABCDEF";
|
||||||
static char *php_convert_to_decimal(double arg, int ndigits, int *decpt, int *sign, int eflag)
|
static char *php_convert_to_decimal(double arg, int ndigits, int *decpt, int *sign, int eflag)
|
||||||
{
|
{
|
||||||
register int r2;
|
register int r2;
|
||||||
|
int mvl;
|
||||||
double fi, fj;
|
double fi, fj;
|
||||||
register char *p, *p1;
|
register char *p, *p1;
|
||||||
/*THREADX*/
|
/*THREADX*/
|
||||||
|
@ -90,13 +91,21 @@ static char *php_convert_to_decimal(double arg, int ndigits, int *decpt, int *si
|
||||||
p1 = &cvt_buf[NDIG];
|
p1 = &cvt_buf[NDIG];
|
||||||
while (fi != 0) {
|
while (fi != 0) {
|
||||||
fj = modf(fi / 10, &fi);
|
fj = modf(fi / 10, &fi);
|
||||||
|
if (p1 <= &cvt_buf[0]) {
|
||||||
|
mvl = NDIG - ndigits;
|
||||||
|
memmove(&cvt_buf[mvl], &cvt_buf[0], NDIG-mvl-1);
|
||||||
|
p1 += mvl;
|
||||||
|
}
|
||||||
*--p1 = (int) ((fj + .03) * 10) + '0';
|
*--p1 = (int) ((fj + .03) * 10) + '0';
|
||||||
r2++;
|
r2++;
|
||||||
}
|
}
|
||||||
while (p1 < &cvt_buf[NDIG])
|
while (p1 < &cvt_buf[NDIG])
|
||||||
*p++ = *p1++;
|
*p++ = *p1++;
|
||||||
} else if (arg > 0) {
|
} else if (arg > 0) {
|
||||||
while ((fj = arg * 10.0) < 0.9999999) {
|
while ((fj = arg * 10) < 1) {
|
||||||
|
if (!eflag && (r2 * -1) < ndigits) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
arg = fj;
|
arg = fj;
|
||||||
r2--;
|
r2--;
|
||||||
}
|
}
|
||||||
|
@ -109,10 +118,17 @@ static char *php_convert_to_decimal(double arg, int ndigits, int *decpt, int *si
|
||||||
cvt_buf[0] = '\0';
|
cvt_buf[0] = '\0';
|
||||||
return (cvt_buf);
|
return (cvt_buf);
|
||||||
}
|
}
|
||||||
while (p <= p1 && p < &cvt_buf[NDIG]) {
|
if (p <= p1 && p < &cvt_buf[NDIG]) {
|
||||||
arg *= 10;
|
arg = modf(arg * 10, &fj);
|
||||||
arg = modf(arg, &fj);
|
if ((int)fj==10) {
|
||||||
|
*p++ = '1';
|
||||||
|
fj = 0;
|
||||||
|
*decpt = ++r2;
|
||||||
|
}
|
||||||
|
while (p <= p1 && p < &cvt_buf[NDIG]) {
|
||||||
*p++ = (int) fj + '0';
|
*p++ = (int) fj + '0';
|
||||||
|
arg = modf(arg * 10, &fj);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (p1 >= &cvt_buf[NDIG]) {
|
if (p1 >= &cvt_buf[NDIG]) {
|
||||||
cvt_buf[NDIG - 1] = '\0';
|
cvt_buf[NDIG - 1] = '\0';
|
||||||
|
@ -286,7 +302,7 @@ php_sprintf_appenddouble(char **buffer, int *pos,
|
||||||
char numbuf[NUM_BUF_SIZE];
|
char numbuf[NUM_BUF_SIZE];
|
||||||
char *cvt;
|
char *cvt;
|
||||||
register int i = 0, j = 0;
|
register int i = 0, j = 0;
|
||||||
int sign, decpt;
|
int sign, decpt, cvt_len;
|
||||||
char decimal_point = EG(float_separator)[0];
|
char decimal_point = EG(float_separator)[0];
|
||||||
|
|
||||||
PRINTF_DEBUG(("sprintf: appenddouble(%x, %x, %x, %f, %d, '%c', %d, %c)\n",
|
PRINTF_DEBUG(("sprintf: appenddouble(%x, %x, %x, %f, %d, '%c', %d, %c)\n",
|
||||||
|
@ -312,6 +328,7 @@ php_sprintf_appenddouble(char **buffer, int *pos,
|
||||||
}
|
}
|
||||||
|
|
||||||
cvt = php_convert_to_decimal(number, precision, &decpt, &sign, (fmt == 'e'));
|
cvt = php_convert_to_decimal(number, precision, &decpt, &sign, (fmt == 'e'));
|
||||||
|
cvt_len = strlen(cvt);
|
||||||
|
|
||||||
if (sign) {
|
if (sign) {
|
||||||
numbuf[i++] = '-';
|
numbuf[i++] = '-';
|
||||||
|
@ -330,10 +347,15 @@ php_sprintf_appenddouble(char **buffer, int *pos,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
while (decpt-- > 0)
|
while (decpt-- > 0) {
|
||||||
numbuf[i++] = cvt[j++];
|
numbuf[i++] = j < cvt_len ? cvt[j++] : '0';
|
||||||
if (precision > 0)
|
}
|
||||||
|
if (precision > 0) {
|
||||||
numbuf[i++] = decimal_point;
|
numbuf[i++] = decimal_point;
|
||||||
|
while (precision-- > 0) {
|
||||||
|
numbuf[i++] = j < cvt_len ? cvt[j++] : '0';
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else if (fmt == 'e' || fmt == 'E') {
|
} else if (fmt == 'e' || fmt == 'E') {
|
||||||
char *exp_p;
|
char *exp_p;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue