[Python-checkins] r70880 - python/branches/py3k-short-float-repr/Python/pystrtod.c
eric.smith
python-checkins at python.org
Tue Mar 31 22:21:51 CEST 2009
Author: eric.smith
Date: Tue Mar 31 22:21:51 2009
New Revision: 70880
Log:
Fixed more tests by adding back in the 'add .0 if the output looks like an integer' flag.
Modified:
python/branches/py3k-short-float-repr/Python/pystrtod.c
Modified: python/branches/py3k-short-float-repr/Python/pystrtod.c
==============================================================================
--- python/branches/py3k-short-float-repr/Python/pystrtod.c (original)
+++ python/branches/py3k-short-float-repr/Python/pystrtod.c Tue Mar 31 22:21:51 2009
@@ -529,10 +529,12 @@
int add_dot_0_if_integer, int use_alt_formatting,
char **float_strings)
{
+ char *start = buf;
char *digits, *digits_end;
int decpt, sign, exp_len;
Py_ssize_t digits_len, i;
int use_exp = 0;
+ int is_integer = 1; /* is the output produced so far just an integer? */
/* _Py_dg_dtoa returns a digit string (no decimal point
or exponent) */
@@ -609,6 +611,7 @@
at least 2 digits in exponent */
*buf++ = digits[0];
*buf++ = '.';
+ is_integer = 0;
strncpy(buf, digits+1, digits_len-1);
buf += digits_len-1;
@@ -618,6 +621,7 @@
/* output: 0.00...00dd...dd */
*buf++ = '0';
*buf++ = '.';
+ is_integer = 0;
for (i = 0; i < -decpt; i++)
*buf++ = '0';
strncpy(buf, digits, digits_len);
@@ -628,6 +632,7 @@
strncpy(buf, digits, decpt);
buf += decpt;
*buf++ = '.';
+ is_integer = 0;
strncpy(buf, digits+decpt, digits_len-decpt);
buf += digits_len-decpt;
}
@@ -638,18 +643,20 @@
for (i = 0; i < decpt-digits_len; i++)
*buf++ = '0';
*buf++ = '.';
+ is_integer = 0;
}
}
/* Add trailing non-significant zeros for non-mode 0 and non-code g, unless doing alt formatting */
int pad = 0;
- if (mode != 0)
+ if (mode != 0) {
if (format_code == 'g') {
if (use_alt_formatting)
pad = 1;
}
else
pad = 1;
+ }
if (pad) {
Py_ssize_t nzeros = precision - digits_len;
@@ -663,14 +670,23 @@
}
/* See if we want to have the trailing decimal or not */
- if (format_code == 'g' && buf[-1] == '.')
+ if (format_code == 'g' && buf[-1] == '.') {
buf--;
+ is_integer = 1; /* XXX not sure if this is correct, should probably change this to detect this case and not add it to begin with */
+ }
/* Now that we've done zero padding, add an exponent if needed. */
if (use_exp) {
*buf++ = float_strings[OFS_E][0];
exp_len = sprintf(buf, "%+.02d", decpt-1);
buf += exp_len;
+ is_integer = 0;
+ }
+
+ /* Add ".0" if we're an integer? */
+ if (add_dot_0_if_integer && is_integer) {
+ *buf++ = '.';
+ *buf++ = '0';
}
*buf++ = '\0';
More information about the Python-checkins
mailing list